Docker docker 中的容器-compose 无法通过主机名找到其他容器
Docker container in docker-compose can't find other containers by hostname
我正在将 docker-compose 文件从 v1 升级到 v3,link 容器在一起时遇到问题。
在 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'
但是 links 已被弃用。现在容器应该共享一个网络(默认情况下它们应该这样做)并且能够使用主机名找到彼此(参见: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
我遇到的问题是数据库容器无法通过主机名找到数据库容器,我得到(我的软件尝试每秒连接 10 秒然后停止):
ERROR: Database postgresql://postgres:@db:5432/postgres NOT found (10
attempts)
我检查了一下,db 容器已经启动,如果我使用它的 IP 地址,它就可以工作,但使用主机名就不行。
如何 link 数据库和数据库容器并确保它每次都能找到它?
信息:我 运行 docker MacOs 上的版本 18.06.0-ce-mac70。
谢谢!
编辑:尝试将其添加到数据库的撰写文件中,但没有解决问题。
ports: '5432:5432'
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "db" to address: Name or service not known
database_1 | (Background on this error at: http://sqlalche.me/e/e3q8)
我从 sqlalchemy 收到此错误,表明数据库容器不知道 db(或 db-1)是什么,并且文件 /etc/hosts 不包含任何提及的另一个容器
正如@sachav 在评论中指出的那样,我反转了 depends_on。
在数据库服务中,
db:
depends_on:
- database
...
强制在数据库之前启动数据库服务,从而防止数据库知道主机数据库的存在!
取出来加
database:
depends_on:
- db
...
成功了:)
谢谢@sachav,我现在自己去面对。
我正在将 docker-compose 文件从 v1 升级到 v3,link 容器在一起时遇到问题。
在 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'
但是 links 已被弃用。现在容器应该共享一个网络(默认情况下它们应该这样做)并且能够使用主机名找到彼此(参见: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
我遇到的问题是数据库容器无法通过主机名找到数据库容器,我得到(我的软件尝试每秒连接 10 秒然后停止):
ERROR: Database postgresql://postgres:@db:5432/postgres NOT found (10 attempts)
我检查了一下,db 容器已经启动,如果我使用它的 IP 地址,它就可以工作,但使用主机名就不行。
如何 link 数据库和数据库容器并确保它每次都能找到它?
信息:我 运行 docker MacOs 上的版本 18.06.0-ce-mac70。
谢谢!
编辑:尝试将其添加到数据库的撰写文件中,但没有解决问题。
ports: '5432:5432'
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "db" to address: Name or service not known database_1 | (Background on this error at: http://sqlalche.me/e/e3q8)
我从 sqlalchemy 收到此错误,表明数据库容器不知道 db(或 db-1)是什么,并且文件 /etc/hosts 不包含任何提及的另一个容器
正如@sachav 在评论中指出的那样,我反转了 depends_on。
在数据库服务中,
db:
depends_on:
- database
...
强制在数据库之前启动数据库服务,从而防止数据库知道主机数据库的存在!
取出来加
database:
depends_on:
- db
...
成功了:)
谢谢@sachav,我现在自己去面对。