Как сделать разные настройки базы данных для локальной разработки и использования docker

Есть проект django, который использует докеризацию для запуска в производственной среде. Настройки следующие

docker-compose.yaml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/gpanel
    depends_on:
      - db
  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=${DATABASE_USER}
      - POSTGRES_PASSWORD=${DATABASE_PASS}
      - POSTGRES_DB=${DATABASE_NAME}

volumes:
  postgres_data:

settings.py

DATABASES = {
    "default": {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': env('DATABASE_NAME'),
        'USER': env('DATABASE_USER'),
        'PASSWORD': env('DATABASE_PASS'),
        'HOST': env('HOST'),
        "PORT": env('PORT'),
    }
}

.env

DATABASE_NAME=pg_db
DATABASE_USER=db_root
DATABASE_PASS=12345
PORT=5432
HOST=db

Так, в settings.py параметр host передается как services имя 'db' в docker-compose.yaml файле. Все это работает при запуске через docker, но мне нужно иметь возможность запускать проект локально без docker. Стандартным для Django способом, используя виртуальное окружение. Для этого я создал локально новую базу данных и пользователя. Проблема в том, что при выполнении команды python manage.py runserver

Я получаю ошибку

django.db.utils.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution

Вы можете использовать переменную окружения для указания значений, которые могут отличаться в зависимости от окружения. Мне нравится подход, при котором настройки по умолчанию соответствуют значениям, которые разработчик может использовать в своей повседневной работе

DATABASES = {
    "default": {
        'HOST': os.environ.get('DB_HOST', 'localhost'),
        ...
    }
}

но затем в вашем файле Compose переопределите эту переменную окружения на значение, специфичное для данного развертывания

version: '3.8'
services:
  web:
    build: .
    ports:
      - '8000:8000'
    depends_on:
      - db
    environment:
      - DB_HOST=db
  db: { ... }

Если вы работаете в какой-то другой среде - например, ваша реальная производственная база данных является управляемой облачной базой данных - вы можете использовать параметры переменных среды для указания различных значений, специфичных для данного развертывания, не изменяя код приложения.

Вернуться на верх