Docker 重命名清单或将 2 张图片合并为一张
Docker rename manifest or merge 2 images into one
我有一个名为 someserver:5000/my_image:v1
的多架构 docker 图像。它被上传到一些本地注册表。已为 2 个平台制作图像:linux/arm64
和 linux/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:v1
是 someserver:5000
注册表上存储库 my_image
的标签。有一些清单是这样标记的。并“指向”一张或多张真实图片(如有错误请指正)。
Docker 显示 solution
解决方案 1(如果您的图像存储在本地或在线)
- (如果在线 - 跳过此步骤)让我们假设您以某种方式在本地计算机上有 2 个图像 -
someserver:5000/my_image:1
和 someserver:5000/my_image:2
。将它们推送到您的注册表中:
docker push someserver:5000/my_image:1
docker push someserver:5000/my_image:2
- 将他们团结在一个清单下
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
- 输入您的注册表:
docker manifest push someserver:5000/my_release_image:v1
解决方案 2(如果你也想重命名清单)
假设您的 someserver:5000/
注册表的 my_image
存储库中已经有一个带有标签 latest
的清单,但您想将其“重命名”为 someserver:5000/my_release_image:v1
- 获取有关标签的信息
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"
}
}
]
}
- 只需创建一个包含不提供标签的摘要的清单:
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
- 输入您的注册表:
docker manifest push someserver:5000/my_release_image:v1
- 删除旧清单:
docker manifest rm someserver:5000/my_image:latest
我有一个名为 someserver:5000/my_image:v1
的多架构 docker 图像。它被上传到一些本地注册表。已为 2 个平台制作图像:linux/arm64
和 linux/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:v1
是 someserver:5000
注册表上存储库 my_image
的标签。有一些清单是这样标记的。并“指向”一张或多张真实图片(如有错误请指正)。
Docker 显示 solution
解决方案 1(如果您的图像存储在本地或在线)
- (如果在线 - 跳过此步骤)让我们假设您以某种方式在本地计算机上有 2 个图像 -
someserver:5000/my_image:1
和someserver:5000/my_image:2
。将它们推送到您的注册表中:
docker push someserver:5000/my_image:1
docker push someserver:5000/my_image:2
- 将他们团结在一个清单下
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
- 输入您的注册表:
docker manifest push someserver:5000/my_release_image:v1
解决方案 2(如果你也想重命名清单)
假设您的 someserver:5000/
注册表的 my_image
存储库中已经有一个带有标签 latest
的清单,但您想将其“重命名”为 someserver:5000/my_release_image:v1
- 获取有关标签的信息
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"
}
}
]
}
- 只需创建一个包含不提供标签的摘要的清单:
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
- 输入您的注册表:
docker manifest push someserver:5000/my_release_image:v1
- 删除旧清单:
docker manifest rm someserver:5000/my_image:latest