【发布时间】:2020-11-18 05:31:20
【问题描述】:
我有一个 postgres 容器,docker-compose.yml:
services:
db:
container_name: db
expose:
- "5432"
ports:
- 5432:5432
volumes:
- postgres_data:/var/lib/postgresql/data/
还有一个带有 settings.py 的 django 项目:
DATABASES = {
'default': {
'HOST': os.environ.get('POSTGRES_HOST', '127.0.0.1')
# etc
}
}
.env
POSTGRES_HOST_DJANGO=db
当我使用 manage.py runserver 0.0.0.0:8000 在本地运行我的 django 应用程序时,它可以正常连接,使用默认的 POSTGRES_HOST=127.0.0.1,因为未加载 .env。
我有时也会在容器中运行我的 django 应用程序:
docker-compose.yml:
web:
#restart: unless-stopped
build: .
env_file: .env
command: bash -c "cd /app/src/ && python manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- 8000:8000
links:
- db:db
但它使用 .env 文件并与 POSTGRES_HOST=db 连接
如果我尝试使用POSTGRES_HOST=db 连接本地运行的 django 应用程序,它会失败:
django.db.utils.OperationalError:无法将主机名“db”转换为地址:名称或服务未知
如果我尝试在带有POSTGRES_HOST=127.0.0.1 的容器中运行 django 应用程序,它会以同样的方式失败。
我怎样才能让他们使用相同的POSTGRES_HOST?
【问题讨论】:
-
你没有;你需要在不同的环境中设置不同的环境变量,这就是
.env文件的用途。 -
你是说不可能吗?两者都读取相同的 .env 文件,所以即使我有两个 .env 文件,我如何让 settings.py 文件知道要读取哪个文件?
-
由于您有两种不同的设置和两种不同的主机名方案,您应该能够使用两个不同的
.env文件。您可以在docker-compose.yml文件中指定备用env_file:,或将不同的配置文件绑定挂载到您的容器中。
标签: django postgresql docker docker-compose django-settings