Docker 重命名清单或将 2 张图片合并为一张

Docker rename manifest or merge 2 images into one

我有一个名为 someserver:5000/my_image:v1 的多架构 docker 图像。它被上传到一些本地注册表。已为 2 个平台制作图像:linux/arm64linux/amd64

我想将这张图片重命名为 someserver:5000/my_release_image:v1。如果是普通图片,我可以:

docker pull someserver:5000/my_image:v1
docker tag someserver:5000/my_image:v1 someserver:5000/my_release_image:v1
docker push someserver:5000/my_release_image:v1

但这是一个由 docker buildx build --platform <ARCHITECTURES> --pull --push ... 完成的多架构镜像,所以在拉取它时我得到了我的架构的修订。

如何重新标记多架构映像?

在我写这篇文章的时候post我找到了一个解决方案。

一开始我还没有真正了解多架构图像是如何创建的以及 docker 中的“清单”是什么。我认为一些多架构镜像 someserver:5000/my_image:v1 就像一个超级镜像,但首先 someserver:5000/my_image:v1someserver:5000 注册表上存储库 my_image 的标签。有一些清单是这样标记的。并“指向”一张或多张真实图片(如有错误请指正)。

Docker 显示 solution

解决方案 1(如果您的图像存储在本地或在线)

  1. 如果在线 - 跳过此步骤)让我们假设您以某种方式在本地计算机上有 2 个图像 - someserver:5000/my_image:1someserver:5000/my_image:2。将它们推送到您的注册表中:
docker push someserver:5000/my_image:1
docker push someserver:5000/my_image:2
  1. 将他们团结在一个清单下 someserver:5000/my_release_image:v1:
docker manifest create someserver:5000/my_release_image:v1 \
--amend someserver:5000/my_image:1 \
--amend someserver:5000/my_image:2 
  1. 输入您的注册表:
docker manifest push someserver:5000/my_release_image:v1

解决方案 2(如果你也想重命名清单)

假设您的 someserver:5000/ 注册表的 my_image 存储库中已经有一个带有标签 latest 的清单,但您想将其“重命名”为 someserver:5000/my_release_image:v1

  1. 获取有关标签的信息
docker manifest inspect someserver:5000/my_image:latest

它会给你这样的东西:

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1,
         "digest": "sha256:long_long_hex_number_1",
         "platform": {
            "architecture": "arch1",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 13735,
         "digest": "sha256:long_long_hex_number_2",
         "platform": {
            "architecture": "arch2",
            "os": "linux"
         }
      }
   ]
}
  1. 只需创建一个包含不提供标签的摘要的清单:
docker manifest create someserver:5000/my_release_image:v1 \
--amend someserver:5000/my_image@sha256:long_long_hex_number_1 \
--amend someserver:5000/my_image@sha256:long_long_hex_number_2
  1. 输入您的注册表:
docker manifest push someserver:5000/my_release_image:v1
  1. 删除旧清单:
docker manifest rm someserver:5000/my_image:latest