如何为本地开发和使用docker进行不同的数据库设置



有一个django项目使用dockerisation在生产环境中运行。设置如下

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:

设置.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中,主机参数作为docker-compose.yaml文件中的services名称'db'传递。当通过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: { ... }

如果您在其他环境中工作——例如,您的实际生产数据库可能是托管云数据库——您可以使用环境变量设置来指定特定于该部署的不同值,而无需实际更改应用程序代码。

最新更新