我在DockerHub上有一个多平台镜像。为了简单起见,我们假设它是amd64和aarch64平台。假设图像(带标记)名为myuser/myimage:mytag
现在,我只想构建amd64镜像,并在dockerhub上替换镜像的amd64部分,让aarch64保持原样。
这一切都是基于这样的假设:我可以在本地为amd64构建镜像(使用buildx和不使用buildx),并且我可以访问myuser
docker hub帐户。
这样做的理由:我为amd64和aarch64平台构建了相当复杂的图像。每个平台的结果图像都有许多标签,这些标签实际上是图像中最终出现的软件版本,如python-3.9.10
。对于这些体系结构,这些标签可能也可能是不同的。我想在amd64和aarch64的构建过程中独立更新DockerHub镜像。对我来说,最简单的方法是创建一个不存在的镜像,如果它已经存在于DockerHub上,则只更新(或添加)必要的部分。
注意:如果我使用docker build ...
+ docker push ...
(在主机amd64机器下)或使用docker buildx build --platform=linux/amd64 --push --tag ... .
,它会完全覆盖图像,并且之前的aarch64图像会丢失。
2条答案
按热度按时间anauzrmj1#
通常,您会使用buildx,e这样的工具一次性为单个标记构建所有平台。例如:
如果你真的想从标签a中获取内容,将其复制到标签b中,并用新的内容替换一个架构的图像,regclient/regctl最近添加了这个功能,但我不推荐它用于此目的,因为它感觉像一个反模式。使用该免责声明,命令看起来像:
isr3a4wc2#
对于那些对这个问题感兴趣的人。我最终独立构建了
aarch64
和x86_64
镜像(使用自托管的aarch64
GitHub运行器)。我还为所有标签添加了一个arch
前缀,以便只能提取一个特定的图像。然后我将图像和标签保存为GitHub工件,然后将两张图像和所有标签拉到一个地方,并使用
docker manifest
命令正确地合并它们。下面是合并的工作原理:merge_tags.py我还写了一篇文章来描述我是如何做到的,并给出了更多的解释:article。