Docker 构建 onnxruntime-node 报错 socket hang up ECONNRESET 解决方案

9次阅读
没有评论

问题现象

在执行 yarn install 构建 Docker 镜像时,onnxruntime-node 安装脚本下载预编译包失败:

plaintext

Error: socket hang up
code: 'ECONNRESET'

完整报错栈:

plaintext

error /app/node_modules/onnxruntime-node: Command failed.
Exit code: 1
Command: node ./script/install
Output:
`nvcc` not found. Assuming CUDA 12.
Downloading "https://github.com/microsoft/onnxruntime/releases/download/v1.21.0/onnxruntime-linux-x64-gpu-1.21.0.tgz"...
node:events:487
      throw er; // Unhandled 'error' event
      ^
Error: socket hang up
code: 'ECONNRESET'

Dockerfile 失败行:修改 package.json 清理 electron 相关包后执行 yarn install --frozen-lockfile

关键点:前面删除 electron 依赖的 NodeJS 脚本执行没有报错,真正失败是 onnxruntime-node 的 postinstall 下载 GitHub Release 包连接被重置,属于国内环境访问 GitHub 网络不稳定导致。

根因分析

  1. onnxruntime-node@1.21.0 安装脚本检测无 nvcc 仍默认拉取 GPU 版本预编译包,文件体积更大,下载耗时久更容易断连;
  2. 下载源托管在 GitHub Releases,国内直连极易出现连接重置(ECONNRESET / socket hang up);
  3. 环境:Node.js v24 + Yarn 1.22.22 + Docker 容器构建;
  4. 附加风险点:高版本 Node 和旧版 onnxruntime-node 存在兼容性隐患。

多种修复方案(按推荐优先级排序)

✅ 方案 1(首选):强制使用 CPU 版 ORT,跳过 GPU 大包下载

通过环境变量 ORT_USE_CPU=1 让安装脚本下载体积更小的 CPU 预编译包,同时配置国内 npm 镜像加速依赖下载,并增加下载超时时间。

修改 Dockerfile 中对应的 RUN 完整片段:

dockerfile

RUN yarn config set registry https://registry.npmmirror.com && \
    node -e "const fs=require('fs');const pkg=JSON.parse(fs.readFileSync('package.json','utf8'));for(const section of ['dependencies','devDependencies']){if(!pkg[section]) continue;for(const name of ['custom-electron-titlebar','electron','electron-builder','electron-rebuild','electronmon']) delete pkg[section][name];}fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)+'\n');" && \
    ORT_USE_CPU=1 ORT_DOWNLOAD_TIMEOUT=120000 yarn install --frozen-lockfile && \
    yarn cache clean

环境变量说明:

  • ORT_USE_CPU=1:强制 CPU 预编译包,不需要 CUDA
  • ORT_DOWNLOAD_TIMEOUT=120000:下载超时拉长至 2 分钟

📌 方案 2:必须使用 GPU 版本(CUDA)

  1. 基础镜像更换为 nvidia/cuda 官方镜像,容器内具备 nvcc 编译环境;
  2. 宿主机配置 nvidia-container-runtime,运行时启用 GPU;
  3. 使用 ghproxy 加速 GitHub 下载(需要修改 onnxruntime-node 内部下载地址,侵入依赖,不推荐常规构建);
  4. 构建命令可追加 --network=host 复用宿主机网络:

bash

docker build --network=host -t your-image .

📌 方案 3:离线构建(内网隔离环境)

  1. 本地提前下载对应预编译 tgz 包:onnxruntime-linux-x64-gpu-1.21.0.tgz
  2. COPY 压缩包进入容器;
  3. 通过 ORT 环境变量指定本地文件路径,完全跳过网络下载。

📌 方案 4:兼容性兜底

如果调整环境变量后依旧报错:

  1. Node 版本降级到 LTS Node 20,onnxruntime-node 对 Node24 适配不完善;
  2. 更换依赖:onnxruntime(纯 JS 绑定,无二进制下载)替代 onnxruntime-node
  3. 锁定 onnxruntime-node 到经过验证稳定的版本。

额外排查清单

  1. Docker Desktop 代理 / DNS 是否异常,关闭无效代理重试;
  2. 确认项目是否真的需要 GPU 推理,绝大多数后端服务 CPU 版本足够使用;
  3. --frozen-lockfile 要求 lock 文件和 package.json 严格匹配,修改 package.json 后不要随意变更依赖版本;
  4. 构建失败后清理 Docker 构建缓存,避免旧层干扰:docker builder prune

小结

这个报错不是代码语法错误,是典型国内容器构建时 GitHub 二进制包下载网络问题。优先使用 ORT_USE_CPU=1 切换 CPU 预编译包,配合 npmmirror 国内镜像,即可低成本解决 socket hang up / ECONNRESET。

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码