如何保留摘要将Docker镜像重新发布至其他镜像仓库
如何将带摘要(digest)的Docker镜像原样推送到私有仓库
Docker CLI本身不支持直接推送image@digest格式的镜像(会报错cannot push a digest reference),但可以通过以下两种方式实现保留原镜像摘要、无额外抽象层的镜像迁移:
方法一:使用skopeo工具(推荐)
skopeo是专门用于跨容器仓库复制镜像的工具,无需将镜像拉取到本地即可直接复制,且能完整保留原镜像的摘要和所有元数据。
步骤1:安装skopeo
- Ubuntu/Debian:
sudo apt-get update && sudo apt-get install skopeo - CentOS/RHEL:
sudo yum install skopeo - macOS(Homebrew):
brew install skopeo
步骤2:直接跨仓库复制镜像
使用skopeo copy命令,指定源镜像和目标镜像的完整digest地址:
# 直接从公共仓库复制到私有仓库(支持登录验证) skopeo copy \ --src-creds "公共仓库用户名:密码" \ --dest-creds "私有仓库用户名:密码" \ docker://docker.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c \ docker://registry.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c
如果无需验证公共仓库(比如拉取公开镜像),可以去掉--src-creds参数。
验证
复制完成后,从私有仓库拉取镜像并检查摘要:
docker pull registry.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c docker inspect registry.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c | grep -i digest
输出的摘要会和原公共镜像完全一致。
方法二:使用Docker CLI(需启用实验性功能)
如果依赖Docker CLI,可以通过推送镜像manifest的方式实现,但需要启用Docker的实验性功能:
步骤1:启用实验性功能
编辑~/.docker/config.json文件,添加"experimental": "enabled":
{ "experimental": "enabled", ...其他配置 }
重启Docker服务生效。
步骤2:拉取原镜像并推送manifest
# 拉取带digest的镜像 docker pull docker.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c # 推送镜像manifest到私有仓库 docker manifest push registry.io/alpine@sha256:c0d488a800e4127c334ad20d61d7bc21b4097540327217dfab52262adc02380c
这种方式同样能保留原镜像的摘要,但实验性功能可能存在兼容性问题,不建议在生产环境中依赖。
内容的提问来源于stack exchange,提问作者Dbercules
相关产品推荐
相关产品推荐

