在私人注册表(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
仍然会遍历每个图像,尝试推送它(尽管跳过上传)。有没有更好的方法来添加远程标签?
答案 0 :(得分:14)
您已说明的方式,docker tag ...; docker push ...
是向图片添加标签并分享标签的最佳方式。
在您给出的具体示例中,两个标记都在同一个仓库中(myregistry.com/myimage
)。在这种情况下,您只需docker push myregistry.com/myimage
,默认情况下,docker
守护程序将同时推送所有代码的标记,从而将迭代保存在共享图层的图层上。
您也可以使用相同的过程(docker tag ...; docker push ...
)在存储库之间标记图像,例如
docker tag myregistry.com/myimage:v1.2.3 otherregistry.com/theirimage:v2
docker push otherregistry.com/theirimage
答案 1 :(得分:2)
拉/标记/推方法会花费时间和网络成本,您只需使用以下方式远程标记图像即可:
仅用于更改 TAG ,答案https://stackoverflow.com/a/38362476/8430173有用,但是我也想更改存储库名称。
非常感谢this,我也更改了repoName!
(在他的Github项目的帮助下):
1-获取清单(在v2模式中)
2-在新仓库中发布每个图层。摘要
3-发布config.layer
4-将整个清单放到新的仓库中
1- GET 清单来自reg:5000/v2/{oldRepo}/manifests/{oldtag}
,带有accept
标头:application/vnd.docker.distribution.manifest.v2+json
2-每一层: POST reg:5000/v2/{newRepo}/blobs/uploads/?mount={layer.digest}&from={oldRepoNameWithaoutTag}
3- POST (reg:5000/v2/{newRepo}/blobs/uploads/?mount={config.digest}&from={oldRepoNameWithaoutTag}
4-PUT reg:5000/v2/{newRepo}/manifests/{newTag}
,其标题为content-type
:来自步骤1响应的application/vnd.docker.distribution.manifest.v2+json
和body
5-享受!