带有 django 的 Docker-compose 无法将主机名“db”转换为地址:名称或服务未知
Posted
技术标签:
【中文标题】带有 django 的 Docker-compose 无法将主机名“db”转换为地址:名称或服务未知【英文标题】:Docker-compose with django could not translate host name "db" to address: Name or service not known 【发布时间】:2017-05-25 04:58:24 【问题描述】:我目前有一个使用 docker-compose 构建的系统,它创建了一个 Django 应用程序。
到目前为止,我在测试版本中使用了容器内的数据库 (postgresql)。现在我已将数据库从这个容器更改为 AWS 中的 RDS 实例。
使用 Pg_dump 我在 RDS 中重新创建了数据库并更改了 settings.py,一切正常。我已经从我的 webapp 内的数据库中访问了数据,没有任何问题。
一切都很好,直到我不得不进行迁移。如果没有数据库容器,Django 容器会给我这个消息:
django.db.utils.OperationalError:无法翻译主机名“db” 收件人:姓名或服务未知
更改前我的 Docker-compose.yml 文件:
version: '2'
services:
db:
image: postgres:9.5
restart: always
environment:
POSTGRES_USER: testing
POSTGRES_PASSWORD: tests
POSTGRES_DB: test
volumes:
- /dbdata:/var/lib/postgresql/data
django:
build: ./django
command: gunicorn contactto.wsgi:application -b 0.0.0.0:8000
restart: always
volumes:
- ./django:/usr/src/app
- ./django/static:/usr/src/app/contactto/static
ports:
- "8000:8000"
depends_on:
- db
更改后的现在:
version: '2'
services:
django:
build: ./django
command: gunicorn contactto.wsgi:application -b 0.0.0.0:8000
restart: always
volumes:
- ./django:/usr/src/app
- ./django/static:/usr/src/app/contactto/static
ports:
- "8000:8000"
还有来自 settings.py 的数据库。 之前:
DATABASES =
'default':
'ENGINE': 'tenant_schemas.postgresql_backend',
'NAME': 'testing',
'USER': 'test',
'PASSWORD': 'test',
'HOST': 'db',
'PORT': '5432',
之后:
DATABASES =
'default':
'ENGINE': 'tenant_schemas.postgresql_backend',
'NAME': 'testing',
'USER': 'test',
'PASSWORD': 'test',
'HOST': 'xxx.rds.amazonaws.com',
'PORT': '5432',
奇怪的是,我可以在我的应用程序中使用 aws 数据库...我可以创建用户并在数据库中执行操作,并且更改会出现。现在在 CLI 中,我什至无法在没有消息的情况下使用 manage.py shell。
我完全迷路了。
【问题讨论】:
答案可以在这个***.com/a/61393097/10526787找到 【参考方案1】:click on此链接以获得您的答案或添加命令:bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
in docker-compose.yaml
。我希望这对您有用。它对我有用
【讨论】:
【参考方案2】:在docker compose文件中添加network、link和depends_on配置。
示例:
services:
db:
build: .
container_name: db
networks:
- djangonetwork
web:
build: .
depends_on:
- db
links:
- db:db
networks:
- djangonetwork
networks:
djangonetwork:
driver: bridge
【讨论】:
这极大地帮助我通过了无网络的 docs.docker 快速入门。我遇到的两件事是networks
与 services
处于同一级别,并将 networks
添加到 web 和 db 配置中。【参考方案3】:
致其他遇到这种情况的人。
以下命令(删除所有未使用的容器、网络、图像和可选的卷)解决了我的问题:
docker system prune
更多信息请参见docker document
【讨论】:
如果这个答案能解释为什么采取这个行动可以解决问题,那就更好了。【参考方案4】:在“depends_on”部分下的 docker-compose.yml 的“django”部分中,尝试在其后添加 links: - db:db
,甚至用它替换depends_on: db。
我敢打赌,如果您输入 docker logs (container name)
,您会发现它显然无法确定“db”指向的位置。
我认为他们希望在新的迭代中终止对 docker-compose 中的链接的支持,至少我在某处读到过。
【讨论】:
【参考方案5】:回答我的问题,这是一个愚蠢的问题......
我的 manage.py 只选择了 base.py 设置文件,并没有考虑到 staging.py 设置文件。所以它在 CLI 中中断,而不是在应用程序内部中断。
【讨论】:
这是否意味着您没有正确配置设置文件? 有人能详细说明他是如何解决这个问题的吗?我也收到了这个错误,已经两天了,我没有找到解决方案:( 我在尝试在 Github Actions 中运行测试时遇到了同样的问题。关键的见解是您的 django 应用程序正在启动并尝试连接到 postgres。在您的设置中的某处,或在运行时继承的设置中,数据库名称/端口配置不正确。如果你认为你知道你在哪里设置它,并且你改变了它,但仍然看到“db”,那么它在某个地方被覆盖了,或者你实际上并没有使用你认为的分支。以上是关于带有 django 的 Docker-compose 无法将主机名“db”转换为地址:名称或服务未知的主要内容,如果未能解决你的问题,请参考以下文章
MongooseModule:无法连接到数据库。在带有 Mongo 的 dockerized Nestjs 应用程序上