bug: manifest invalid if retag and push to new artifactory

用户在 Langfuse 项目中使用 Docker 命令: docker pull langfuse/langfuse:latest → docker tag → docker push 到一个新的自定义 Artifactory(镜像仓库地址为 xxx.xxx.com/langfuse/langfu

bug: manifest invalid if retag and push to new artifactory

bug: manifest invalid if retag and push to new artifactory

快速结论:该报错通常出现在将 Docker 镜像 retag 并推送到新的 Artifactory 仓库时,推送过程显示所有层已成功,但最终返回 manifest invalid: manifest invalid 错误。优先排查目标 Artifactory 是否兼容 OCI 镜像格式及其 manifest schema 版本。

问题场景

用户在 Langfuse 项目中使用 Docker 命令:docker pull langfuse/langfuse:latestdocker tagdocker push 到一个新的自定义 Artifactory(镜像仓库地址为 xxx.xxx.com/langfuse/langfuse:latest)时,所有镜像层推送成功,但最终 manifest 验证失败。

报错原文

manifest invalid: manifest invalid

推送日志末尾示例如下:

...
364f90d01431: Pushed
d21971417e92: Pushed
aba337309a79: Pushed
78561cef0761: Layer already exists
manifest invalid: manifest invalid

原因分析

可能原因包括:

  • Artifactory 不兼容 OCI 镜像格式:Issue 中用户通过 docker manifest inspect 发现原始镜像的 mediaTypeapplication/vnd.oci.image.index.v1+json 以及子 manifest 的 application/vnd.oci.image.manifest.v1+json。某些较旧的 Artifactory 或 registry 不支持 OCI 规范,只接受 Docker 规范(application/vnd.docker.distribution.manifest.v2+json),导致 manifest 被拒绝。
  • Manifest schema 版本问题:用户猜测是否 mediaType 需要从 v1+json 改为 v2+json,但该问题在 Issue 中未得到明确验证。
  • 认证/权限不足:推送目标 Artifactory 可能要求特定权限。
  • Registry 配置限制:目标 Artifactory 可能需要显式开启 Docker 或 OCI 支持。

以上均为推测(Issue 未给出确切结论),当排除其他原因后,可优先尝试检查目标 Artifactory 是否支持 OCI 镜像格式。

环境排查

  • Docker Client 版本:26.1.4(用户提供)
  • Docker Server 版本:26.1.4
  • containerd 版本:1.6.33
  • OS/Arch:linux/amd64
  • 目标 Artifactory 支持的 manifest 媒体类型(建议查阅其文档确认是否支持 application/vnd.oci.image.index.v1+json

解决步骤

  1. 检查目标 Artifactory 是否兼容 OCI:查阅其官方文档,确认其支持的 Docker/OCI 镜像格式及 manifest schema 版本。
  2. 尝试转换 manifest 格式:如果 Artifactory 仅支持 Docker 格式,可使用 docker manifest annotate 或构建工具将 OCI manifest 转换为 Docker 格式(需注意转换后的兼容性和依赖)。
  3. 验证认证和权限:确认用户具有目标 Artifactory 的推送权限(如正确的用户名/密码或 token)。
  4. 更新 Docker 版本:确保客户端和服务器均为较新版本,避免因版本差异导致的 manifest 兼容问题(用户版本 26.1.4 较新,但仅供参考)。
  5. 测试其他镜像:尝试推送一个简单的非 OCI 镜像(如 hello-world)到同一 Artifactory,验证 registry 本身是否正常工作。

验证方法

成功推送后,执行 docker pull xxx.xxx.com/langfuse/langfuse:latest 并确认镜像可以被正常拉取和运行。或者使用 docker manifest inspect xxx.xxx.com/langfuse/langfuse:latest 检查远端 manifest 结构是否完整。

参考来源

langfuse/langfuse #4864

celebrityanime
celebrityanime
文章: 14485

发表回复

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