我正在将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
我遇到的问题是数据库容器无法通过主机名找到数据库容器,而我却得到了(我的软件尝试每秒连接10秒钟,然后停止):
错误:未找到数据库postgresql:// postgres:@db:5432 / postgres(10 尝试)
我检查了db容器的状态,如果我使用它的IP地址,那么它可以工作,但是不能使用主机名。
如何链接数据库和数据库容器并确保每次都能找到它?
信息:我在MacO上运行docker版本18.06.0-ce-mac70。
谢谢!
编辑:尝试将其添加到db的撰写文件中,但没有解决问题。
端口:“ 5432:5432”
sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)无法将主机名“ db”转换为地址:名称或服务未知 database_1 | (此错误的背景位于:http://sqlalche.me/e/e3q8)
我从sqlalchemy收到此错误,该错误指示数据库容器不知道什么是db(或db-1),并且文件/ etc / hosts不包含任何其他容器的提示
答案 0 :(得分:1)
正如@sachav在评论中指出的,我颠倒了depends_on。
在数据库服务中,
db:
depends_on:
- database
...
强制db服务在数据库之前启动,从而阻止数据库知道主机db存在!
取出并添加
database:
depends_on:
- db
...
成功了:)
谢谢@sachav,我现在就自己动起来。