
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:latest → docker tag → docker 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发现原始镜像的mediaType为application/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)
解决步骤
- 检查目标 Artifactory 是否兼容 OCI:查阅其官方文档,确认其支持的 Docker/OCI 镜像格式及 manifest schema 版本。
- 尝试转换 manifest 格式:如果 Artifactory 仅支持 Docker 格式,可使用
docker manifest annotate或构建工具将 OCI manifest 转换为 Docker 格式(需注意转换后的兼容性和依赖)。 - 验证认证和权限:确认用户具有目标 Artifactory 的推送权限(如正确的用户名/密码或 token)。
- 更新 Docker 版本:确保客户端和服务器均为较新版本,避免因版本差异导致的 manifest 兼容问题(用户版本 26.1.4 较新,但仅供参考)。
- 测试其他镜像:尝试推送一个简单的非 OCI 镜像(如
hello-world)到同一 Artifactory,验证 registry 本身是否正常工作。
验证方法
成功推送后,执行 docker pull xxx.xxx.com/langfuse/langfuse:latest 并确认镜像可以被正常拉取和运行。或者使用 docker manifest inspect xxx.xxx.com/langfuse/langfuse:latest 检查远端 manifest 结构是否完整。


