我正在为我的 Django 项目使用
django-environ
包。
我在 .env
文件中提供了数据库 URL,如下所示:
DATABASE_URL=psql://dbuser:dbpassword@dbhost:dbport/dbname
我的数据库设置在
settings.py
:
DATABASES = {
"default": env.db(),
}
到目前为止,我没有任何问题。
然后,我创建了一个
docker-compose.yml
,其中指定我的项目使用 Postgres 数据库,即:
version: '3.8'
services:
...
db
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=???
- POSTGRES_PASSWORD=???
- POSTGRES_DB=???
- "POSTGRES_HOST_AUTH_METHOD=trust"
现在我有点困惑。
我如何提供这些
POSTGRES_*
环境。变量在那里?我是否需要将它们作为单独的变量与我的 DATABASE_URL
文件中的 .env
一起提供?如果是,实现此目标的最佳方法是什么?我的目标是避免设置重复。
您可以在
.env
文件中使用变量扩展。类似的东西
DB_NAME=dbname
DB_USER=dbuser
DB_PASSWORD=dbpassword
DATABASE_URL=psql://$DB_USER:$DB_PASSWORD@dbhost:dbport/$DB_NAME
然后在你的撰写文件中添加类似的内容
services:
postgresdb:
container_name: projectname_db
image: postgres:15
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
ports:
- "127.0.0.1:5432:5432"
...
我不太熟悉 django-environ 但这应该可行
显然,
django-environ
不支持变量扩展(从v0.10.0开始),所以我发现的方法是拼写出各个选项,而不是使用env.db()
Django 设置
DATABASES = {
"default": {
# ...
"NAME": env("DB_NAME"),
"USER": env("DB_USER"),
"PASSWORD": env("DB_PASSWORD"),
},
}
Docker 组合
version: '3.8'
services:
# ...
db:
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
您只需要在 docker-compose 文件的 Django 容器块中引用您的 .env 文件。这是 Django 设置文件可以使用
os.environ.get()
访问它们的地方。 docker-compose 文件中 environment
属性中的环境变量不会从 .env 文件中插入。仅当在运行 compose 文件的 shell 中导出变量时,它们才会在那里进行插值。它帮助我在遇到同样的问题时查看这些文档:Docker Compose 中的环境变量优先级。
Django 设置:
import os
DATABASES = {
'default': {
# ...
"POSTGRES_DB": os.environ.get("DB_NAME"),
"POSTGRES_USER": os.environ.get("DB_USER"),
"POSTGRES_PASSWORD": os.environ.get("DB_PASSWORD")
# ...
}
}