4

我已经开始使用 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

4

3 回答 3

2

有几种方法可以标记图像,但它们都涉及使用所需标记推送特定于平台的清单。使用 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 版本,因为它们包含辅助二进制文件。

于 2021-08-15T23:40:46.047 回答
1

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

完成初始后:

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 秒。

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

于 2021-11-10T20:13:20.297 回答
0

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

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
于 2021-08-16T16:32:47.767 回答