You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:37:42