![[Bug]: Nodeenv installation is triggered on startup](https://www.chat-gpts.plus/wp-content/uploads/2026/07/24554-2ca2fb64.jpg)
[Bug]: Nodeenv installation is triggered on startup
快速结论:该报错发生在 LiteLLM 使用 hardened Docker 镜像启动时,容器在初始化数据库(prisma migrate deploy)过程中会尝试从 nodejs.org 下载 Node.js 环境(nodeenv),但在断网或 air-gapped 环境中会导致 TCP_DENIED 错误。优先排查:运行时镜像中是否缺少 npm/nodejs 依赖,以及 prisma 冷启动时是否会回退到 nodeenv。
问题场景
用户使用 BerriAI/litellm 的 hardened Docker 镜像(来自 hardended docker image 目录),在 air-gapped(网络隔离)环境下启动 LiteLLM 代理。容器启动时执行数据库迁移(prisma migrate deploy),此时 prisma-python 客户端触发 nodeenv 安装流程,尝试从 nodejs.org 下载 Node.js 运行时,但因网络受限而失败。
报错原文
1774426630.066 0 10.XX.XX.XX TCP_DENIED/403 3392 CONNECT nodejs.org:443 - HIER_NONE/- text/html
# 在允许 nodejs.org 访问后,出现进一步的共享库错误:
{"message": "prisma db error: /home/nonroot/.cache/prisma-python/nodeenv/bin/node: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory\n, e: ", "level": "INFO", "timestamp": "2026-03-25T08:34:06.002022"}
# 在 v1.90.0+ 版本中,完整的 prisma migrate deploy 失败日志:
subprocess.CalledProcessError: Command '['/root/.cache/prisma-python/nodeenv/bin/npm', 'install', 'prisma@5.4.2']' returned non-zero exit status 127.
, e: Installing Prisma CLI
An error ocurred while installing the Prisma CLI; npm install log: node: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory
原因分析
可能原因:LiteLLM 的 hardened Docker 镜像在构建时,虽然 builder 阶段已安装 npm/nodejs 以支持 prisma generate(构建时的客户端代码生成),但运行时(runtime)阶段有意未包含 npm。然而,当容器在冷启动时执行 prisma migrate deploy 操作针对新的/实时数据库时,prisma-python 需要引导(bootstrap)Prisma CLI,如果运行时 PATH 中没有 npm,它会回退到使用 nodeenv 自行安装 Node.js。在 v1.89.0 及之后版本中,这个回退行为触发了网络下载请求,并且在断网环境下失败。此外,新版本的 Node.js (26.x) 引入了对 libatomic.so.1 的依赖,而运行时镜像未包含该库,导致 nodeenv 安装的 npx 无法运行,最终 npm install 返回 exit status 127。
根据 Issue 中用户的回归范围分析,该问题在 v1.90.0 及更高版本(截至 v1.93.0-rc.1)中复现,而 v1.89.0 及之前版本正常。
环境排查
- LiteLLM 版本:确认是否为 v1.90.0 及以上版本(v1.93.0-rc.1 仍有问题)
- Docker 镜像来源:hardended Docker 镜像 vs. 官方
litellm.ai/berriai/litellm - 运行时镜像中是否包含 npm:docker exec <容器> which npm 是否返回空
- 运行时镜像中是否包含 libatomic:docker exec <容器> ldconfig -p | grep libatomic
- 数据库初始化方式:是冷启动(新 PostgreSQL 实例/卷)还是已有数据库
- 网络环境:是否有代理限制(如 squid),是否允许访问 nodejs.org
解决步骤
- 可优先尝试:在运行时镜像中添加 npm/nodejs 和 libatomic 依赖 – 模仿 builder 阶段的做法,在 Dockerfile 的 runtime stage 中执行
apk add npm nodejs libatomic,确保运行时 PATH 中有 npm,避免 nodeenv 回退。 - 如果无法修改 Docker 镜像,可尝试预置 Prisma CLI:在构建镜像时确保
prisma generate后生成的.prisma/client等目录被完整拷贝到运行时阶段,并验证缓存中已有正确的 Prisma CLI 二进制文件。 - 如果网络受限但可以允许特定域名访问,添加 nodejs.org 的放行规则,但 Issue 表明这只能绕过 TCP_DENIED 错误,仍会遇到 libatomic 缺失问题,因此不是根本解决方案。
- 回退到已知正常版本 v1.89.0 或 v1.89.3 作为临时工作区。
- 等待官方修复:参考 Issue 中建议的解决方案(添加 npm/nodejs 到运行时阶段),或自行构建自定义镜像。
验证方法
启动容器后,在日志中检查是否仍有“Running prisma migrate deploy”之后的错误信息。正常情况应看到:
Running prisma migrate deploy
...
All migrations have been successfully applied.
prisma migrate deploy completed
如果看到 subprocess.CalledProcessError 或 error while loading shared libraries 说明问题未解决。此外,执行数据库相关的管理 API 调用(如创建团队)不应返回 HTTP 500 及 “table does not exist” 错误。



