Docker 重命名清单或将 2 个映像合并为一个

kos*_*hok 6 bash manifest docker

我有一个名为 的多架构 docker 映像someserver:5000/my_image:v1。它被上传到一些本地注册表。图像已为 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
Run Code Online (Sandbox Code Playgroud)

但这是由 完成的多架构图像docker buildx build --platform <ARCHITECTURES> --pull --push ...,因此在拉取它时我得到了架构的修订版。

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

kos*_*hok 8

当我写这篇文章时,我找到了解决方案。

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

Docker 清单解决方案

解决方案 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
Run Code Online (Sandbox Code Playgroud)
  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 
Run Code Online (Sandbox Code Playgroud)
  1. 推入您的注册表:
docker manifest push someserver:5000/my_release_image:v1
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 获取有关标签的信息
docker manifest inspect someserver:5000/my_image:latest
Run Code Online (Sandbox Code Playgroud)

它会给你这样的东西:

{
   "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"
         }
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  1. 推入您的注册表:
docker manifest push someserver:5000/my_release_image:v1
Run Code Online (Sandbox Code Playgroud)
  1. 删除旧清单:
docker manifest rm someserver:5000/my_image:latest
Run Code Online (Sandbox Code Playgroud)