Docker构建因Prisma网络连接问题(EAI_AGAIN)失败
问题:Docker构建Express+Prisma项目时网络连接失败(
npx prisma generate步骤) 项目配置与错误信息
Dockerfile
FROM node:20 WORKDIR /app COPY . . RUN npm install RUN npx prisma generate RUN npm run build EXPOSE 3000 CMD ["node", "dist/index.js"]
构建错误
Error: request to https://binaries.prisma.sh/all_commits/34ace0eb2704183d2c05b60b52fba5c43c13f303/debian-openssl-3.0.x/schema-engine.sha256 failed, reason: getaddrinfo EAI_AGAIN binaries.prisma.sh
已执行的排查步骤
- DNS设置:将Docker守护进程DNS改为谷歌公共DNS(
8.8.8.8、8.8.4.4)并重启Docker服务 - 网络模式:启用Docker BuildKit,构建时使用
--network host选项 - 基础镜像:尝试
node:18-alpine、node:18-slim等不同Node.js镜像 - 代理检查:确认环境无代理配置
- 临时容器网络测试:
初始访问Prisma二进制服务器成功:
输出:docker run --rm -it alpine sh -c "apk add --no-cache curl && curl -I https://binaries.prisma.sh"
后续访问Alpine软件源失败:HTTP/2 404 date: Mon, 15 Jul 2024 14:57:00 GMT content-type: text/html vary: Accept-Encoding cache-control: max-age=120 cf-cache-status: MISS server: cloudflare cf-ray: 8a3a9a3adc253b27-BOMfetch https://dl-cdn.alpinelinux.org/alpine/v3.20/main/x86_64/APKINDEX.tar.gz WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.20/main: temporary error (try again later) fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/community/x86_64/APKINDEX.tar.gz WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.20/community: temporary error (try again later) - 手动依赖安装:本地生成Prisma客户端后复制到镜像,构建成功但容器连接云数据库失败
- Busybox网络测试:
docker run --rm busybox ping -c 4 google.com无丢包 - Docker网络配置检查:bridge网络配置正常,子网为
172.17.0.0/16,网关172.17.0.1
额外环境信息
- 主机系统:Endeavour OS,内核Linux 6.9.9-arch1-1
- Docker版本:27.0.3
- Prisma版本:5.16.2
- Node.js版本:20.13.1
核心问题
- 如何确保Docker容器在构建过程中具备正常网络连通性?
- 还有哪些Docker网络配置需要考虑?
- Prisma二进制服务器是否存在问题,如何规避?
解决方案与建议
1. 确保Docker构建过程网络连通性
- 强制使用BuildKit并指定构建网络:
构建时显式启用BuildKit并绑定主机网络,避免容器网络隔离导致的解析问题:DOCKER_BUILDKIT=1 docker build --network=host -t your-image-name . - 持久化DNS配置:
在/etc/docker/daemon.json中添加DNS配置并重启Docker,确保所有容器/构建过程使用稳定DNS:
执行{ "dns": ["8.8.8.8", "8.8.4.4"] }systemctl restart docker生效。 - 增加构建步骤重试机制:
针对临时网络波动,在npx prisma generate步骤添加重试逻辑:RUN npx prisma generate || (sleep 5 && npx prisma generate)
2. 需额外检查的Docker网络配置
- 主机防火墙/iptables规则:
检查主机防火墙是否拦截Docker bridge网络的出站请求,确保172.17.0.0/16网段能正常访问公网。 - MTU匹配设置:
若主机网卡MTU小于1500(比如PPPoE网络),需在daemon.json中设置Docker MTU与主机一致:{ "mtu": 1450 } - 禁用IPv6:
若主机未配置IPv6,关闭Docker的IPv6支持避免解析冲突:{ "ipv6": false } - 构建时显式指定DNS:
构建命令中直接指定DNS服务器,覆盖默认配置:docker build --dns 8.8.8.8 --dns 8.8.4.4 -t your-image-name .
3. Prisma二进制服务器问题的规避方案
- 使用国内镜像源:
在Dockerfile中添加环境变量,指定Prisma二进制文件的国内镜像地址,避免连接国外服务器失败:ENV PRISMA_BINARY_MIRROR="https://mirrors.tuna.tsinghua.edu.cn/prisma/" - 本地预生成Prisma客户端:
本地执行npx prisma generate生成客户端文件,然后在Dockerfile中直接复制该目录,跳过构建时的generate步骤:FROM node:20 WORKDIR /app COPY package*.json ./ RUN npm install # 复制本地预生成的Prisma客户端 COPY prisma/client ./prisma/client COPY . . RUN npm run build EXPOSE 3000 CMD ["node", "dist/index.js"] - 离线部署Prisma二进制:
从Prisma官方下载对应版本的二进制文件(如schema-engine),放置到项目的.prisma/bin目录,然后在Dockerfile中指定路径:ENV PRISMA_CLI_BINARY_PATH="./.prisma/bin/schema-engine"
内容的提问来源于stack exchange,提问作者Rahul Barman
相关产品推荐
相关产品推荐

