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
- Debian/Ubuntu基础镜像:
延长Prisma数据库连接超时时间
在DATABASE_URL中增加连接超时参数,避免偶发的连接超时问题:DATABASE_URL: postgresql://postgres:docker@urefer-db:5432/urefer?schema=public&connect_timeout=30(可选)简化网络配置
Docker Compose默认创建的专有网络本身就自带容器名DNS解析能力,如果你不需要自定义网络参数,可以删除配置中所有自定义networks相关配置,使用默认网络即可,避免自定义网络带来的DNS异常问题。
验证方法
如果调整后仍有问题,可以进入web容器手动验证DNS解析是否正常:
- 执行
docker exec -it urefer-backend sh进入容器 - 执行
nslookup urefer-db,如果能正常返回db容器的IP地址,说明DNS无异常,问题仍出在启动时序配置上
内容的提问来源于stack exchange,提问作者snu
相关产品推荐
相关产品推荐

