【问题标题】:Tagging multi-platform images in ECR creates untagged manifests在 ECR 中标记多平台图像会创建未标记的清单
【发布时间】:2021-10-17 18:12:26
【问题描述】:

我已经开始使用 docker buildx 来标记多平台图像并将其推送到 ECR。但是,ECR 似乎将标记应用于父清单,并将每个相关清单保留为未标记。 ECR 似乎确实可以防止删除子清单,但它使管理清理孤立的未标记图像变得复杂。

有没有办法以某种方式标记这些子清单?

例如,考虑这个推送:

docker buildx build --platform "linux/amd64,linux/arm64" --tag 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0 --push  . 

检查图像:

 docker buildx imagetools inspect 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0

演出:

Name:      1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest:    sha256:4221ad469d6a18abda617a0041fd7c87234ebb1a9f4ee952232a1287de73e12e
       
Manifests: 
    Name:      1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0@sha256:c1b0c04c84b025357052eb513427c8b22606445cbd2840d904613b56fa8283f3
    MediaType: application/vnd.docker.distribution.manifest.v2+json
    Platform:  linux/amd64
         
    Name:      1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0@sha256:828414cad2266836d9025e9a6af58d6bf3e6212e2095993070977909ee8aee4b
    MediaType: application/vnd.docker.distribution.manifest.v2+json
    Platform:  linux/arm64

但是,ECR 将 2 个子图像显示为 untagged

【问题讨论】:

    标签: amazon-web-services docker amazon-ecr docker-buildkit


    【解决方案1】:

    有几种方法可以标记图像,但它们都涉及使用所需标记推送特定于平台的清单。使用 docker,您可以拉取镜像、重新标记并推送它,但缺点是您必须拉取每一层。

    一个更快的选择是仅使用注册表 API 调用传输清单 json。你可以用 curl 做到这一点,但身份验证变得复杂。有几种工具可以直接与注册中心合作,包括 Google 的起重机、RedHat 的 skopeo 和我自己的 regclient。 Regclient 包含 regctl 命令,该命令将实现如下:

    regctl image copy \
      1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0@sha256:c1b0c04c84b025357052eb513427c8b22606445cbd2840d904613b56fa8283f3 \
      1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0-linux-amd64
    
    regctl image copy \
      1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0@sha256:828414cad2266836d9025e9a6af58d6bf3e6212e2095993070977909ee8aee4b \
      1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0-linux-arm64
    

    您还可以编写一个自动修复脚本,列出注册表中的所有标签,提取尚未拥有该平台的标签的清单列表,并运行映像副本以重新标记每个平台的清单。但是,在 buildx 推送映像后,编写 buildx 作业的脚本以包含 regctl 之类的内容可能更容易、更快捷。

    请注意,如果您使用 cred 帮助程序登录 ECR,regctl 可以将其与本地命令一起使用。如果想将 regctl 作为容器运行,并且您专门使用 ecr-login,请使用 alpine 版本的图像,因为它们包含辅助二进制文件。

    【讨论】:

    • 非常感谢。这就是我要找的。使用本地 docker 是有问题的,因为我无法提取 ARM 映像。请注意,鉴于我们使用的是 AWS ECR,我还可以使用 aws ecr batch-get-image 来获取清单,并使用 aws ecr put-image 来重写。不过,您的脚本看起来更优雅。
    • 感觉 AWS 应该更新 ECR 以在该列中显示图像名称+架构而不是 。并且可能也会在图像详细信息页面上显示。现在,带有所有这些 名称的 ECR 页面看起来非常难看。鉴于 fargate 只有 x86 Xeon 服务器(还没有基于 arm 的 graviton 服务器),我猜 AWS 正在追赶“多架构 docker 镜像”领域。这很奇怪,因为他们推动了更快/更便宜的引力子...... AWS:你能授予我访问你的代码仓库的权限,以便我可以在 UI 中进行更改吗? :)
    【解决方案2】:

    除了上面提到的 Brandon 使用 regctl 的内容之外,如果您希望将其与 ECR 凭证助手一起使用,这里是 skopeo 的命令。 https://github.com/awslabs/amazon-ecr-credential-helper

    skopeo copy \ 
    docker://1234567890.dkr.ecr.us-west-2.amazonaws.com/stackoverflow@sha256:1badbc699ed4a1785295baa110a125b0cdee8d854312fe462d996452b41e7755 \
    docker://1234567890.dkr.ecr.us-west-2.amazonaws.com/stackoverflow:1.0-linux-arm64
    

    https://github.com/containers/skopeo

    • Paavan Mistry,AWS 容器 DA

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。到目前为止,我的解决方案似乎比其他一些建议更容易一些,但我仍然不喜欢它。

      做完初始后:

      docker buildx build --platform "linux/amd64,linux/arm64" --tag 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0 --push  . 
      

      我跟进:

      docker buildx build --platform "linux/amd64" --tag 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0-amd --push  .
      docker buildx build --platform "linux/arm64" --tag 1234567890.dkr.ecr.eu-west-1.amazonaws.com/my-service/my-image:1.0-arm --push  .
      

      这让我获得了同时构建多个平台的并行构建速度,并获得了在 ECR 中标记的图像。由于缓存了构建信息,它非常快,它似乎只是推送标签,就是这样。在测试中,我刚刚做了第一个命令的 buildx 时间是 0.5 秒。第二个耗时 0.7 秒。

      也就是说,我对这个解决方案并不狂热,并且在寻找更好的解决方案时发现了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 2017-04-18
        • 2015-01-24
        • 1970-01-01
        相关资源
        最近更新 更多