【发布时间】:2018-07-26 16:06:14
【问题描述】:
我正在将 docker-compose 文件从 v1 升级到 v3,但在将容器链接在一起时遇到问题。
在 docker-compose.yml 之前是这样的:
database:
working_dir: /mnt
volumes:
- .:/mnt
links:
- postgresql_db
ports:
- '3000:3000'
build: ./database
entrypoint: python database/server.py
postgresql_db:
build: ./database
ports:
- '5432:5432'
test_database:
working_dir: /mnt
volumes:
- .:/mnt
links:
- test_postgresql_db
ports:
- '5053:5053'
build: ./database/test
test_postgresql_db:
image: postgres:latest
ports:
- '5432:5432'
但链接已被弃用。现在容器应该共享一个网络(默认情况下它们应该这样做)并且能够使用主机名找到彼此(参见:here)。
所以我将文件修改为:
version: '3'
networks:
dbnet:
driver: bridge
volumes:
postgresql_data: {}
postgresql_test_data: {}
services:
database:
build: database
environment:
APPLICATION_DB_CONTAINER: db
APPLICATION_POSTGRES_HOST: db
working_dir: /mnt
volumes:
- .:/mnt
networks:
- dbnet
ports:
- '3000:3000'
command: python database/server.py
db:
image: postgres:latest
volumes:
- postgresql_data:/var/lib/postgresql/data
networks:
- dbnet
depends_on:
- database
test_database:
build: database/test
environment:
APPLICATION_DB_CONTAINER: testdb
working_dir: /mnt
volumes:
- .:/mnt
command: python -m pytest --cov=database --cov-report term --cov-report html:htmlcov database/test/
testdb:
image: postgres:latest
volumes:
- postgresql_test_data:/var/lib/postgresql/data
我遇到的问题是数据库容器无法通过主机名找到 db 容器并且我得到了(我的软件尝试每秒连接 10 秒然后停止):
错误:找不到数据库 postgresql://postgres:@db:5432/postgres (10 尝试)
我检查了,db 容器已经启动,如果我使用它的 IP 地址,那么它可以工作,但使用主机名不能。
如何链接数据库和 db 容器并确保每次都能找到它?
信息:我在 MacO 上运行 docker 版本 18.06.0-ce-mac70。
谢谢!
编辑:尝试将其添加到 db 的撰写文件中,但没有改变问题。
端口:'5432:5432'
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) 无法将主机名“db”转换为地址:名称或服务未知 数据库_1 | (此错误的背景:http://sqlalche.me/e/e3q8)
我从 sqlalchemy 收到此错误,表明数据库容器不知道 db(或 db-1)是什么,并且文件 /etc/hosts 不包含对另一个容器的任何提及
【问题讨论】:
-
不确定这是否是您的具体问题,但您尚未为 db 服务公开端口
5432。 -
如果容器在同一个网络中,可以使用容器名本身访问容器
-
嗨,我试图暴露端口 5432 但它没有改变,问题是我得到一个未找到主机的错误...还尝试使用容器名称(例如对于 db,我使用了 db-1) 但它没有改变。 /etc/hosts 文件中没有任何行包含 db 容器...
-
您的撰写文件指出您的
db容器依赖于database容器。不应该反过来吗? -
哦,确实。似乎反转depends_on会强制数据库服务始终在db之前启动,从而阻止数据库知道主机db。谢谢@sachav!你找到了:)
标签: docker docker-compose docker-networking