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

M1 Mac下同网络Docker容器无法通过容器名通信问题求助

问题根因

从你给出的日志可以确认不是DNS解析问题,核心是启动时序不匹配:

  • depends_on配置仅保证PostgreSQL容器先于web容器启动,不会等待PostgreSQL进程完全初始化完成、可以接受TCP连接
  • Prisma迁移命令的默认连接超时时间较短,刚好卡在PostgreSQL进程就绪前触发了连接报错,你手动换IP时因为间隔时间较长,PostgreSQL已经就绪所以可以正常连接
解决方案
  • 增加数据库就绪等待逻辑
    在web容器的启动命令前增加端口检测逻辑,等待PostgreSQL的5432端口可访问后再执行Prisma迁移和服务启动命令,示例启动配置如下:

    # 在docker-compose.yml的web服务配置中添加command字段
    command: >
      sh -c "
      while ! nc -z urefer-db 5432; do
        sleep 1
      done
      npx prisma migrate dev --name init
      # 替换为你实际的服务启动命令
      node app.js
      "
    

    注意如果你的基础镜像没有预装netcat,可以在Dockerfile中提前安装:

    • Debian/Ubuntu基础镜像:RUN apt-get update && apt-get install -y --no-install-recommends netcat
    • Alpine基础镜像:RUN apk add --no-cache netcat-openbsd
  • 延长Prisma数据库连接超时时间
    在DATABASE_URL中增加连接超时参数,避免偶发的连接超时问题:

    DATABASE_URL: postgresql://postgres:docker@urefer-db:5432/urefer?schema=public&connect_timeout=30
    
  • (可选)简化网络配置
    Docker Compose默认创建的专有网络本身就自带容器名DNS解析能力,如果你不需要自定义网络参数,可以删除配置中所有自定义networks相关配置,使用默认网络即可,避免自定义网络带来的DNS异常问题。

验证方法

如果调整后仍有问题,可以进入web容器手动验证DNS解析是否正常:

  1. 执行docker exec -it urefer-backend sh进入容器
  2. 执行nslookup urefer-db,如果能正常返回db容器的IP地址,说明DNS无异常,问题仍出在启动时序配置上

内容的提问来源于stack exchange,提问作者snu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:48:03