【问题标题】:docker push fails : manifest invaliddocker push 失败:清单无效
【发布时间】:2019-11-28 15:32:08
【问题描述】:

当尝试对私有 docker 镜像注册表执行 docker push <IMAGE> 时, 收到错误提示 ma​​nifest invalid

除了错误,它还给出了一些 [DEPRECATION NOTICE],这也可能是导致失败的原因。

注意:在收到此错误且 docker push 命令失败后。 (在 ci/cd 中,它的工作失败了,我猜它在抛出 exit 1 ),当我重新检查注册表时,图像存在。

在同一个 docker 注册表中,还存在其他图像。他们也正在经历相同的 CI/CD 管道。但对他们来说,没有检测到问题。问题是否有可能源自Dockerfile? (虽然它以前可以工作,但使用相同的 Dockerfile

我已经仔细检查了,我推送的图像version(例如:<IMAGE_NAME>:0.0.1-5e90df92ed140-development)在注册表中不存在。

我还提到了与此相关的多个问题和问题,并交叉检查了

  • 用户有权推拉图片
  • 清单具有与history 相同数量的fsLayers

注意:我们使用的是 JFrog Artifactory 版本到 6.12.2

Docker 版本(在我的本地机器上,它也失败了。带有相同的消息):

Client: Docker Engine - Community
 Version:           19.03.4
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        9013bf5
 Built:             Thu Oct 17 23:44:48 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.4
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       9013bf5
  Built:            Thu Oct 17 23:50:38 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

错误:

596280599f68: Layer already exists
5d6cbe0dbcf9: Pushed 
[DEPRECATION NOTICE] registry v2 schema1 support will be removed in an upcoming release. Please contact admins of the xxxxxxx.docker.repositories.xxxxxx.com registry NOW to avoid future disruption. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
manifest invalid: manifest invalid

【问题讨论】:

  • 什么版本的 docker 客户端、引擎和注册表?你是如何构建图像的?
  • @BMitch 使用 docker 引擎和客户端版本更新了问题。虽然不确定注册表版本。当我检查manifest.jsonschemaVersion:1
  • @BMitch 我现在正在使用 docker build 命令构建,在使用 Jenkins 构建时也面临同样的问题。

标签: docker dockerfile docker-registry


【解决方案1】:

遇到了同样的问题。问题是 repo 不允许您覆盖图像标签。我将标签更改为新的主要版本。

【讨论】:

  • 您是说图像标签已经存在于存储库中并且在尝试推送时?如果是这样,那么我检查了多次,直到 docker push 失败才存在。
【解决方案2】:

在 6.16 中遇到了 samish 问题。 问题与授权有关。我还必须将删除/覆盖存储库操作添加到构建代理用户。

构建代理只有写权限,第二次构建相同标签的镜像,无法覆盖manifest!这使得客户端由于某种原因回滚到 schema1。

通过 Artifactory 的系统日志弄清楚了。

【讨论】:

  • 嘿,谢谢你的信息,但对我来说,我用来推送的用户有这个权限。
  • 您好,您找到解决此问题的方法了吗?
  • @Humblefool 到现在还没有,
【解决方案3】:

这可能发生在您的系统(例如 Ubuntu)将 docker-ce-cli 升级到较新版本后,例如从 5:19.03.15~3-0~ubuntu-bionic5:20.10.3~3-0~ubuntu-bionic

如果目前无法将您的 docker-registry 升级到较新版本,那么您可以尝试将 docker-ce-cli 降级到某个以前的版本。 要查看可用版本列表:

sudo apt-cache policy docker-ce-cli

降级到以前的版本运行:

sudo apt install docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic

同样的方法可以用于降级docker-ce包。

检查版本:

docker --version

然后尝试再次推送:

docker push your-docker-registry.com:5000/myprojects/my-postgresql-image:latest

请注意,让您的软件保持最新可能会提高系统的安全性!

【讨论】:

    【解决方案4】:

    将我的工件发布到工件中失败,原因与 manifest invalid: manifest invalid 相同,因为存在以前的 docker 映像。删除 docker 镜像解决了这个问题。

    错误

    The push refers to repository [xxxxx.com/foo]
    83850d400bdd: Pushed
    309acb279757: Pushed
    ebf469e844a6: Layer already exists
    94c94d3b2e6b: Layer already exists
    manifest invalid: manifest invalid
    ? Error: The command exited with status 1
    

    移除 docker 镜像

    docker image rm <name>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多