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

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"
    
    输出:
    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-BOM
    
    后续访问Alpine软件源失败:
    fetch 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

核心问题

  1. 如何确保Docker容器在构建过程中具备正常网络连通性?
  2. 还有哪些Docker网络配置需要考虑?
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:00:57