5

有一种众所周知的方法可以将 docker 镜像从一个容器注册表复制到另一个。如果原始注册表是 dockerhub,典型的工作流程是这样的:

docker pull <image:tag>
docker tag <image:tag> <new-reg-url/uid/image:tag>
docker push <new-reg-url/uid/image:tag>

现在,在处理具有多架构层的图像时,您是如何进行上述操作的?

根据此链接中的信息,您可以依赖buildx构建多架构图像,并且在这样做的同时,您还可以将它们上传到您希望的任何存储库,但是我如何在不必先构建图像的情况下做到这一点?

看起来buildxcli 不必要地(?)将上传过程与构建过程耦合在一起。有什么建议么?

谢谢!

4

1 回答 1

5

虽然docker pull ...; docker tag ...; docker push ...语法是在注册表之间移动图像的简单方法,但它有几个缺点。首先,正如您所见,它将多平台图像取消引用到单个平台。第二个是即使远程注册表已经有这些层,它也会将所有层拉到 docker 引擎,这对于那些总是需要拉取每一层的临时 CI 工作人员来说是一个糟糕的方法。

为此,我更喜欢直接与注册表服务器而不是 docker 引擎本身对话。您不需要引擎的功能来运行图像,您只需要注册表 API。Docker 已经记录了最初的注册表 API,OCI 最近在分发规范上达到了 1.0,这应该让我们得到一些标准化。

有各种基于这些规范的工具,从 docker 引擎本身和 containerd,到 skopeo,谷歌的起重机,我也一直在研究regclient。使用 regclient 的 regctl 命令执行此操作如下所示:

regctl image copy <source_image:tag> <target_image:tag>

结果是各种层、图像配置、清单和多平台清单列表将在注册表之间复制,但仅限于目标注册表上尚不存在的层。

于 2021-07-29T13:31:54.267 回答