所以,基本上我有这个 docker-compose.yml
配置。
services:
postgres:
container_name: youtube_manager_postgres
restart: always
image: postgres:alpine
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=qwerty123
- POSTGRES_DB=ytmanager
volumes:
- postgres_data:/var/lib/postgresql/data/
ports:
- "5432:5432"
django:
container_name: youtube_manager_django
restart: always
build:
context: ../
dockerfile: deploy/django/Dockerfile
command: sh -c "poetry run python3 manage.py migrate &&
poetry run python3 manage.py collectstatic --no-input --clear &&
poetry run uwsgi --ini /etc/uwsgi.ini"
ports:
- "8000:8000"
volumes:
- staticfiles:/code/static
- mediafiles:/code/media
depends_on:
- postgres
我的Django的数据库偏好是:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'ytmanager',
'USER': 'admin',
'HOST': '0.0.0.0',
'PASSWORD': 'qwerty123',
'PORT': '5432',
}
}
我想用两种方式来使用它:1. docker-compose up -d postgres
然后 python3 manage.py runserver
(其实。poetry run python3 manage.py runserver
但现在无所谓了)在开发过程中,2.运行 docker-compose up
在部署过程中。
目前,使用1号选项可以正常工作,但当我在执行 docker-compose up
我得到一个错误。
youtube_manager_django | django.db.utils.OperationalError: could not connect to server: Connection refused
youtube_manager_django | Is the server running on host "0.0.0.0" and accepting
youtube_manager_django | TCP/IP connections on port 5432?
如果我这样改变Django数据库的设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'ytmanager',
'USER': 'admin',
'HOST': '0.0.0.0',
'PASSWORD': 'qwerty123',
'PORT': '5432',
}
}
执行 docker-compose up -d postgres
然后 python manage.py runserver
导致错误。
django.db.utils.OperationalError: could not translate host name "postgres" to address: Temporary failure in name resolution
我怎么能正确配置 docker-compose.yml
同用 HOST
在Django设置中?(例如。'HOST': '0.0.0.0'
或 'HOST': 'postgres'
两个选项)。)
我曾试着用 network_mode: host
在我的django和postgres服务上。它工作得很好,但是有没有其他的方法来解决这个问题(例如,使用网络设置?我读了docker-compose网站上的文档,但不明白是怎么回事)。)
我觉得你把开发环境和生产环境混在一起了(顺便说一下,你第二次粘贴Django数据库设置时,可能是指的是 'HOST': 'postgres'
)
所以,如果我没说错的话。
在开发过程中,你需要在你的Django设置.py文件中, 'HOST': '0.0.0.0'
,因为我认为你是在执行 python manage.py runserver
在docker之外,将postgres保存在docker中。
在生产过程中,你希望在你的Django设置.py文件中也有同样的设置。'HOST': '0.0.0.0'
但为了让它工作,你需要 'HOST': 'postgres'
(匹配编译文件中的服务名称),然后在docker上运行一切(按原样执行整个编译文件)。docker-compose up
). 在这种情况下,Django无法访问 '0.0.0.0'
数据库主机,因为它运行的是 "容器化",而且该IP不绑定到任何服务,所以它需要服务的IP或名称。'postgres'
.
在我看来,解决方案是有两个yml文件被Docker调用(例如. docker-compose -f docker-compose-development.yml up
):
在每个.yml文件中,你可以使用不同的env变量或设置,以干净利落的方式覆盖开发和生产之间的差异。
你可以看一下。https:/github.compydannycookiecutter-django。. 它是一个使用Docker的模板Django项目。
它遵循 "十二因子 "应用方法论。https:/12factor.net。
简而言之。
env_file:
./.envs/.production/.postgres
在编辑Django DB配置之前,请确保以下几点。
两个容器都在同一个网络中运行。
Postgres服务在容器中运行。
服务'postgres'可以从webapp容器中访问。为此,你可以登录到容器并进行ping测试。docker exec -it containerID /bin/bash (in some cases /bin/sh) # to login to container
解决办法。
希望能帮到你