Docker Compose中web容器无法解析Postgres主机名问题求助
问题:Web容器无法解析Postgres主机名
我尝试通过Docker Compose实现Web容器与Postgres容器的通信,以下是我的Compose配置文件:
version: '2' services: web: restart: always build: cloudpebble/ ports: - "8090:8090" volumes: - "./cloudpebble/:/code" links: - redis - postgres:postgres - s3 - qemu - ycmd depends_on: - postgres environment: - DEBUG="yes" - RUN_WEB="yes" - AWS_ENABLED="yes" - PORT=8090 - AWS_S3_FAKE_S3=10.0.0.4:8003 - MEDIA_URL=http://10.0.0.4:8003/builds.cloudpebble.net/ - QEMU_URLS=http://10.0.0.4:8001/ - YCM_URLS=http://10.0.0.4:8002/ - PUBLIC_URL=http://10.0.0.4:8090/ - LIBPEBBLE_PROXY=wss://cloudpebble-ws.herokuapp.com/tool - PEBBLE_AUTH_URL=https://auth.rebble.io networks: - dbnet celery: build: cloudpebble/ volumes: - "./cloudpebble/:/code" links: - redis - postgres - s3 environment: - DEBUG="yes" - RUN_CELERY="yes" - AWS_ENABLED=yes - EXPORT_ROOT=http://10.0.0.4/export.cloudpebble.net/ - AWS_S3_FAKE_S3=10.0.0.4:8003 qemu: build: cloudpebble-qemu-controller/ volumes: - "./cloudpebble-qemu-controller/:/code" ports: - "8001:80" ycmd: build: cloudpebble-ycmd-proxy/ volumes: - "./cloudpebble-ycmd-proxy/:/code" ports: - "8002:80" redis: image: redis postgres: image: postgres ports: - "5432:5432" networks: - dbnet container_name: postgres s3: image: kuracloud/fake-s3 ports: - "8003:4569" networks: default: name: pebble dbnet: driver: bridge
当前问题:尽管两个网络都已创建,但Web容器无法识别Postgres,报错信息:
could not translate host name "postgres" to address: Name or service not known
已尝试的解决方法:
- 升级到Compose v2
- 使用独立网络
- 添加links配置
- 先启动Postgres容器再启动Web容器
解决方案
1. 修复网络配置冲突
你的Web容器仅加入了dbnet网络,但它依赖的redis、s3等服务只在默认的pebble网络中,同时links引用了这些跨网络服务,导致DNS解析异常。需要让Web容器同时加入两个网络:
web: # 保留其他配置 networks: - default - dbnet
同理,Celery容器也依赖跨网络服务,需同步修改:
celery: # 保留其他配置 networks: - default - dbnet
2. 移除冗余的links配置
Docker Compose v2中,同一网络内的容器可直接通过服务名访问,links已被自动服务发现替代,移除该配置避免冲突:
web: # 删除以下links字段 # links: # - redis # - postgres:postgres # - s3 # - qemu # - ycmd
Celery容器的links也可一并移除。
3. 验证配置并重启容器
修改后执行以下命令重置容器:
docker-compose down -v docker-compose up -d
进入Web容器测试Postgres连通性:
docker-compose exec web ping postgres
若能ping通则DNS解析正常,再检查应用内数据库连接配置(端口、用户名/密码是否匹配Postgres默认值)。
内容的提问来源于stack exchange,提问作者blockarchitech
相关产品推荐
相关产品推荐

