Как сделать разные настройки базы данных для локальной разработки и использования 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: { ... }
Если вы работаете в какой-то другой среде - например, ваша реальная производственная база данных является управляемой облачной базой данных - вы можете использовать параметры переменных среды для указания различных значений, специфичных для данного развертывания, не изменяя код приложения.