[Bug]: LiteLLM Docker image is broken for all fresh deployments since v1.90.0 — DB migrations silently fail (libatomic.so.1)

使用 LiteLLM Docker 镜像进行全新部署(新环境、CI 管道、首次容器启动),连接到一个全新的空 PostgreSQL 数据库时触发。代理启动后看似正常,但所有涉及团队/预算/模型/凭据的 API 调用都会返回 HTTP 500。该问题影响 v1.90.0 及之后的所有版本。

[Bug]: LiteLLM Docker image is broken for all fresh deployments since v1.90.0 — DB migrations silently fail (libatomic.so.1)

[Bug]: LiteLLM Docker image is broken for all fresh deployments since v1.90.0 — DB migrations silently fail (libatomic.so.1)

快速结论:自 v1.90.0 起,所有全新部署的 LiteLLM Docker 镜像在首次启动时数据库迁移会静默失败,根本原因是运行时镜像中缺少 npm,导致 Prisma 在启动时被迫回退到 nodeenv 并因 libatomic.so.1 缺失而崩溃。优先排查运行时镜像中 npm 是否在 PATH 上。

问题场景

使用 LiteLLM Docker 镜像进行全新部署(新环境、CI 管道、首次容器启动),连接到一个全新的空 PostgreSQL 数据库时触发。代理启动后看似正常,但所有涉及团队/预算/模型/凭据的 API 调用都会返回 HTTP 500。该问题影响 v1.90.0 及之后的所有版本。

报错原文

Running prisma migrate deploy
node: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory
subprocess.CalledProcessError: Command ['.../nodeenv/bin/npm', 'install', 'prisma@5.4.2'] returned non-zero exit status 127.
Database migration failed but continuing startup
HTTP 500: The table 'public.LiteLLM_TeamTable' does not exist in the current database.

原因分析

根本原因在于 #28888 修复了构建阶段(builder stage)的 npm 问题,但错误地假设运行时阶段(runtime stage)不再需要 npm。事实上,prisma migrate deploy 在容器启动时针对全新数据库仍需要 npm 来引导 Prisma CLI。当 npm 不在 PATH 上时,Prisma 的解析器会回退到 nodeenv,而 Wolfi 基础镜像不提供 libatomic.so.1,导致 Node.js 崩溃。

更精确的测量证实:v1.89.4 镜像中 npm 位于 /usr/local/bin/npm,而 v1.90.0 镜像中 shutil.which("npm") 返回 None,导致解析器落入 nodeenv 分支。libatomic.so.1 在 v1.89.4 中同样缺失,但因为 npm 存在,nodeenv 从未被调用。

# 测量结果(取自 Issue 评论)
ghcr.io/berriai/litellm:v1.89.4
  shutil.which("npm")        -> /usr/local/bin/npm
  _get_global_binary("npm")  -> /usr/local/bin/npm    (resolver takes the 'global' branch)

ghcr.io/berriai/litellm:v1.90.0
  shutil.which("npm")        -> None
  _get_global_binary("npm")  -> None                  (resolver falls through to from_nodeenv())

注意:docker/Dockerfile.non_root 的第 123 行也存在相同的运行时缺失 npm 问题,该文件的 npm 仅在 ui-builder 和 builder 阶段出现,不会传递到第 114 行开始的运行时阶段。

环境排查

  • 确认使用的 LiteLLM Docker 镜像标签是否为 v1.90.0 或更新版本
  • 确认同时部署了新的空 PostgreSQL 数据库(无 litellmdb schema)
  • 确认 DATABASE_URL 环境变量已设置
  • 检查容器内 shutil.which("npm") 是否返回路径(非根用户镜像同样缺失)
  • 确认 Prisma 版本为 0.11.0(该报告两端确认相同,非 Prisma 本身变化)

解决步骤

  1. 临时降级方案:使用 LiteLLM 镜像标签 v1.89.4 或之前版本部署,直到官方修复发布。
  2. 修复方案(可优先尝试):npm(以及 nodejs)添加回运行时阶段的 apk 安装列表中——参照 #28519/#28888 对构建阶段的修复方式。
  3. 对于非根用户镜像(Dockerfile.non_root),同样需要修改第 123 行附近的 apk add 命令,添加 npm
  4. 另一种替代方案(由 Issue 提出但未实现):预构建 Prisma CLI/query engine,避免在运行时调用 nodeenv。

注意:在 Dockerfile 中直接添加 libatomic 到运行时镜像不是正确的修复方式——它只是让已出错的 nodeenv 路径能够工作;正确的修复是保持 npm 存在,从而阻止解析器离开全局分支进入 nodeenv。

验证方法

容器启动后检查日志:确认 prisma migrate deploy 不再报错,且不再出现 libatomic.so.1: cannot open shared object file 错误。同时向任意团队/预算相关 API 端点发出请求,确认返回 HTTP 200 而不是 500(表不存在错误)。也可在容器内运行 shutil.which("npm") 检查 npm 是否在 PATH 上。

参考来源

BerriAI/litellm #33650

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 14115

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注