[英]Republish Docker Image with Preserved Digest to Different Registry
我从 DockerHub 等公共注册表中提取镜像,并将它们推送到一个单独的私有注册表。 对于image:tag
格式的图像,这是一个简单的过程,但对于image@digest
格式的图像则不然。
我想重新发布或推送 Docker 的术语,从公共注册表到我的私有注册表的图像,同时保持确切不可变图像的完整性。 我想保留摘要,以便在从我的私有注册表引用的摘要与公共注册表中的图像源之间没有抽象。
我试图在image@digest
上执行适用于image:tag
的相同docker push
命令,但无济于事。
图片:标签推送
docker login -u usr -p psw registry.io
docker image pull docker.io/alpine:3.17.0
docker image push registry.io/alpine:3.17.0
...
ok
图片@摘要:推送
docker login -u usr -p psw registry.io
docker image pull docker.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c
docker image push registry.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c
...
cannot push a digest reference
我想按原样将图像从源重新发布到目标。 我可以执行重新标记或使用不同 ID 的推送,但两者都会导致更改可引用的摘要和似乎不必要的抽象级别。
你想要做的是重命名图像,然后推送它。 当您将映像推送到存储库时,您会将其推送到由映像名称指定的存储库。 因此,首先重命名(实际上更改tag
)以包含您要推送到的注册表,然后进行推送。
docker image pull centos:centos7
docker tag centos:centos7 my-registry.io/centos7:centos7
docker push my-registry.io/centos/centos7
我无法使用 Docker 解决此问题。相反,我调查了 Skopeo。 v1.6.0引入了--preserve-digests
标志,听起来非常完美。 它是。
我实现如下:
skopeo copy \
--dest-creds='usr:psw' \
--preserve-digests \
--override-arch amd64 \
docker://docker.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c \
docker://registry.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c
完成保留摘要的副本后,我想添加一些额外的内容,但发现文档有点难以浏览。 我最终找到了我正在寻找的所有答案和补充标志,所以我认为我应该在这里发布以防他们帮助别人。 我必须通读在 Skopeo 的复制命令中使用的可用传输(存储库类型),这是我发现--dest-creds
和--preserve-digests
的地方,但我无法发现--override-arch
作为立即成为全球标志!
有多种工具可用于管理注册表中的映像。 并且大多数支持复制图像,包括多平台清单,而不修改摘要。 一些例子包括:
crane copy
)skopeo copy
)regctl image copy
)使用 docker CLI 对此不起作用,因为将图像拉到 docker 会将多平台清单取消引用到您平台的图像。 当 docker 推送图像时,它可能会重新生成图像清单 json,可能会丢失注释等数据,或更改间距,并且编组 json 中的任何单个字符更改都会更改摘要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.