我需要在两个隔离的存储库之间高效地复制 Docker 镜像。当前将镜像保存到磁盘并将其作为 tarball 传输的方法非常耗时,因此我正在寻找一种能够实现以下目的的流程:
- 通过仅复制每个层一次来消除冗余的图像层,即使该层被多个图像使用。
- 避免复制远程存储库中已存在的层。
这可能吗?我该怎么做?
答案1
我建议不要将图像作为打包的 tar 文件进行传输,而是使用OCI 图像布局格式将存储库表示为磁盘上的目录。将内容复制到此目录或从此目录中复制内容可以利用内容可寻址存储中的层重复数据删除。您需要确保每次传输内容时都重复使用同一个磁盘,以避免下载之前提取的层。
有几种工具可以处理这种格式的图像。我知道的有口服抗凝剂(最初来自微软),斯科佩奥(来自 RedHat),以及注册客户端(我自己的项目)。
下面是使用 regclient 的 regctl 命令的示例:
# copy to disk
regctl image copy ${public_repo}:${tag} ocidir://path/to/disk:${tag}
# transfer the disk across the air-gap
# copy from disk to internal registry
regctl image copy ocidir://path/to/disk:${tag} ${private_repo}:${tag}
如果您有很多图像,regclient/regsync 命令可能是您正在寻找的。