将远程标记添加到泊坞窗图像

jvl*_*nag 11 docker

在私人注册表(myregistry.com)上,假设我的图像标记为'v1.2.3'.然后我推动它:

docker push myregistry.com/myimage:v1.2.3

如果我想关联另一个标签,说'staging',并将该标签推送到我的注册表,我可以:

docker tag myregistry.com/myimage:v1.2.3 myregistry.com/myimage:staging docker push myregistry.com/myimage:staging

虽然这有效,但第二个docker push仍然会遍历每个图像,试图推送它(尽管跳过上传).有没有更好的方法来添加远程标签?

Fra*_*Nel 34

您可以使用docker buildx imagetools create来实现此目的

docker buildx imagetools create myregistry.com/myimage:v1.2.3 --tag myregistry.com/myimage:staging
Run Code Online (Sandbox Code Playgroud)

这将简单地下载图像清单myregistry.com/myimage:v1.2.3并将其重新标记(并推送)为myregistry.com/myimage:staging

注意:当您“重新标记”时(例如,当您的映像是为 linux/arm64 和 linux/amd64 构建的)时,这也将保留多平台清单列表。传统的 docker 拉/推策略将仅保留您执行拉/推操作的系统平台/架构的映像清单。


And*_*ndy 14

您所说的方式docker tag ...; docker push ...是向图像添加标签并共享它的最佳方式.

在您给出的具体示例中,两个标签都在同一个repo(myregistry.com/myimage)中.在这种情况下,您可以只是docker push myregistry.com/myimage默认情况下docker守护程序将同时推送repo的所有标记,从而在共享图层的图层上保存迭代.

您也可以使用相同的process(docker tag ...; docker push ...)来标记存储库之间的图像,例如

docker tag myregistry.com/myimage:v1.2.3 otherregistry.com/theirimage:v2
docker push otherregistry.com/theirimage
Run Code Online (Sandbox Code Playgroud)

  • 如果您有多平台图像并且您尝试重新标记的原始图像不在本地计算机上(即您首先必须拉取它),则此方法不起作用。这是因为“docker pull”仅拉取与本地计算机的平台架构相匹配的镜像层,那么如果您推送新标签,您将仅推送具有单个平台架构层的镜像。 (3认同)

Gaë*_*ann 10

有了谷歌的起重机,你就可以做到

crane tag myregistry.com/myimage:v1.2.3 staging
Run Code Online (Sandbox Code Playgroud)

它适用于 docker 镜像和 OCI 镜像,本地不会下载任何镜像,甚至会跳过层验证,因为它们保证已经存在于存储库中。

它甚至可以在 docker 镜像中使用:gcr.io/go-containerregistry/crane

请注意,还有其他类似的工具,例如regctlskopeo


Neg*_*iri 6

pull/tag/push 方法会产生时间和网络成本,您可以使用以下方法远程标记您的图像:

仅用于更改标签,答案/sf/answers/2685373351/有效,但我也想更改存储库名称

非常感谢这一点,我也更改了 repoName!

(在他的Github项目的帮助下):

1- 获取清单(在 v2 模式中)
2- 在新仓库中发布每个 layer.digest
3- 发布 config.layer
4- 将整个清单放入新仓库


细节:

1-reg:5000/v2/{oldRepo}/manifests/{oldtag}带有accept标头的 GET 清单:application/vnd.docker.distribution.manifest.v2+json

2-对于每一层:POST reg:5000/v2/{newRepo}/blobs/uploads/?mount={layer.digest}&from={oldRepoNameWithaoutTag}

3- 后 reg:5000/v2/{newRepo}/blobs/uploads/?mount={config.digest}&from={oldRepoNameWithaoutTag}

4- PUT reg:5000/v2/{newRepo}/manifests/{newTag}content-type标头:application/vnd.docker.distribution.manifest.v2+json以及body来自步骤 1 的响应

5-享受吧!