docker-compose中的Docker容器无法通过主机名找到其他容器

小ama

我正在将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'

但是不推荐使用链接。现在,容器应该共享一个网络(默认情况下应该这样做),并且能够使用主机名相互查找(请参阅:此处)。

所以我将文件修改为:

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次尝试)

我检查了数据库容器,如果我使用它的IP地址,则它正常工作,但使用主机名却无效。

如何链接数据库和db容器,并确保每次都能找到它?

信息:我在MacO上运行Docker版本18.06.0-ce-mac70。

谢谢 !

编辑:试图将其添加到db的撰写文件中,但没有更改问题。

端口:“ 5432:5432”

sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)无法将主机名“ db”转换为地址:名称或服务未知 (有关此错误的背景,请访问:http : //sqlalche.me/e/e3q8

我从sqlalchemy收到此错误,该错误指示数据库容器不知道什么是db(或db-1),并且文件/ etc / hosts不包含任何其他容器的提及。

小ama

正如@sachav在评论中指出的那样,我反转了depends_on。

在数据库服务中,

db:
  depends_on:
    - database
...

强制在数据库之前启动db服务,从而阻止数据库知道主机db存在!

取出并添加

database:
  depends_on:
    - db
...

搞定了:)

谢谢@sachav,我现在就自己动起来。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何通过其主机名ping Docker网络中的其他容器?

Docker容器的本地主机名

如何在docker-compose中设置主机名?

如何通过“主机名”在Docker容器之间进行通信

从其他主机上的另一个容器通过SSH进入docker容器

如何永久设置Docker容器的主机名/ IP?

无法通过主机名/名称ping Docker容器

无法在Docker容器之间解析主机名

如何在容器中解析docker主机名(/ etc / hosts)

docker容器主机名顺序号

从Python程序的docker容器中获取主机名

PostgreSQL客户端无法解析Docker容器中的主机名

Docker-compose:设置主机名等于容器运行所在的主机名

确保主机名和Docker容器中的用户名和用户ID相同

可以从容器中确定Docker主机的主机名吗?

将主机名绑定到容器docker

在docker compose中获取主机的主机名

无法从同一网络中的另一个Docker容器解析集合主机名

docker-compose在url中解析主机名

docker-compose主机名以在容器之间通信与postgres一起使用,但不适用于app

无法通过主机名连接到Docker容器中的MongoDB

Docker每个容器使用不同的主机名

了解 docker-compose.yml 中容器的主机名

为什么PHP docker容器查不到MYSQL容器的主机名?

Docker compose 无法访问其他容器的端口

Docker 组成唯一的容器名称和主机名

docker-compose up 找不到其他容器主机

将传入的 docker 连接绑定到 docker 容器内的特定主机名

无法从 Docker 中的容器外部访问主机名