我已经开始使用docker来标记mutli平台映像并将其推送到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将两个子图像显示为untagged。
发布于 2021-08-15 23:40:46
有几种方法可以标记映像,但它们都涉及使用所需的标记推送平台特定的清单。有了码头,你可以拉图像,保持它,并推动它,但不利的是,你将不得不拉每一层。
一个更快的选项是只使用注册表API调用传输清单json。你可以用卷发来做这件事,但是这个过程变得复杂了。有几种直接使用注册中心的工具,包括谷歌起重机、RedHat的skopeo和我自己的雷格。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,请使用高寒版本的图像,因为它们包含帮助器二进制文件。
发布于 2021-11-10 20:13:20
我也遇到了同样的问题。到目前为止,我的解决方案似乎比其他一些建议容易一些,但我仍然不喜欢它。
在完成初始操作后:
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中标记的图像。由于已经缓存了构建信息--它非常快,它似乎只是按一下标签,仅此而已。在一个测试中,我刚刚完成了第一个命令的构建时间为0.5秒。第二个花了0.7秒。
尽管如此,我并不热衷于这个解决方案,而是在寻找一个更好的解决方案时发现了这个问题。
发布于 2021-08-16 16:32:47
除了上面提到的关于使用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-arm64https://github.com/containers/skopeo
https://stackoverflow.com/questions/68790184
复制相似问题