问题现象
在执行 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 网络不稳定导致。
根因分析
onnxruntime-node@1.21.0安装脚本检测无nvcc仍默认拉取 GPU 版本预编译包,文件体积更大,下载耗时久更容易断连;- 下载源托管在 GitHub Releases,国内直连极易出现连接重置(
ECONNRESET / socket hang up); - 环境:Node.js v24 + Yarn 1.22.22 + Docker 容器构建;
- 附加风险点:高版本 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 预编译包,不需要 CUDAORT_DOWNLOAD_TIMEOUT=120000:下载超时拉长至 2 分钟
📌 方案 2:必须使用 GPU 版本(CUDA)
- 基础镜像更换为
nvidia/cuda官方镜像,容器内具备 nvcc 编译环境; - 宿主机配置
nvidia-container-runtime,运行时启用 GPU; - 使用 ghproxy 加速 GitHub 下载(需要修改 onnxruntime-node 内部下载地址,侵入依赖,不推荐常规构建);
- 构建命令可追加
--network=host复用宿主机网络:
bash
docker build --network=host -t your-image .
📌 方案 3:离线构建(内网隔离环境)
- 本地提前下载对应预编译 tgz 包:
onnxruntime-linux-x64-gpu-1.21.0.tgz; - COPY 压缩包进入容器;
- 通过 ORT 环境变量指定本地文件路径,完全跳过网络下载。
📌 方案 4:兼容性兜底
如果调整环境变量后依旧报错:
- Node 版本降级到 LTS Node 20,onnxruntime-node 对 Node24 适配不完善;
- 更换依赖:
onnxruntime(纯 JS 绑定,无二进制下载)替代onnxruntime-node; - 锁定 onnxruntime-node 到经过验证稳定的版本。
额外排查清单
- Docker Desktop 代理 / DNS 是否异常,关闭无效代理重试;
- 确认项目是否真的需要 GPU 推理,绝大多数后端服务 CPU 版本足够使用;
--frozen-lockfile要求 lock 文件和 package.json 严格匹配,修改 package.json 后不要随意变更依赖版本;- 构建失败后清理 Docker 构建缓存,避免旧层干扰:
docker builder prune
小结
这个报错不是代码语法错误,是典型国内容器构建时 GitHub 二进制包下载网络问题。优先使用 ORT_USE_CPU=1 切换 CPU 预编译包,配合 npmmirror 国内镜像,即可低成本解决 socket hang up / ECONNRESET。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)