我有一个
docker.tar
文件,其中包含大量 docker 镜像 - 该文件的大小相当大,约为 44 GB。这些图像将从 tar 文件加载,重新标记,然后推送到另一个注册表。总而言之,由于图像数量较多,整个过程可能需要大约 40 分钟。
到目前为止,我已成功地将时间缩短到大约 20 分钟,因为我使用
xargs
在重新标记图像后推送图像。图像的加载是我想要尝试解决的下一件事,因为这也需要一些时间。
我尝试使用
split
将原始 tar 文件分割成更小的部分,然后使用 xargs
这种方式尝试 docker load
但是我收到一些错误,说这些新的 tar 文件未正确创建(标头不正确,意外的 EOF 等)
除此之外,我还没有发现太多关于这个主题的内容:https://forums.docker.com/t/docker-save-load-performance/9245 - 但有一条评论提供了可能的改进处理
docker save
还有其他方法可以提高
docker load
的速度吗?理想情况下,需要在 bash
中完成可能的改进。
更新:请在下面找到有关如何保存、加载、重新标记和推送图像的过程。如果需要更多信息,请评论。
docker.tar
文件docker.tar
文件加载图像:RED="\033[1;31m"
GREEN="\033[1;32m"
NOCOLOR="\033[0m"
IMAGE_TAR=$1
logger() {
echo -e "`date '+%Y-%m-%d %H:%M:%S:'` $@" | tee -a ${LOG_FILE}
}
logger "Loading [$IMAGE_TAR]..."
docker load --input ${IMAGE_TAR}
LIST_OF_DOCKER_IMAGES=`docker image list | awk '{print $1":"$2;}'`
该脚本的调用方式如下:
bash load_docker_images.sh docker.tar
在这种情况下不需要使用
docker pull; docker save; docker load; docker tag; docker push
。所有这些步骤都是转换内容、将其移入后端存储系统、将其提取到临时目录等,而这不需要简单地在具有气隙的两个注册表之间移动图像。
如今常见的解决方案是使用 OCI 布局将图像存储在文件系统上,可以选择压缩内容(如果您在打包脚本的过程中已经压缩了其他一些文件,我会跳过它,因为这是多余的) 。多种工具允许您将图像复制到 OCI 布局或从 OCI 布局复制图像,包括来自 Google 的
crane
、来自 Microsoft 的 oras
、来自 RedHat 的 skopeo
以及来自我自己的 regctl
。例如。使用 regctl
,命令将如下所示:
# in the CI job
regctl image copy $source ocidir://$dir:$tag
# ... package scripts and $dir into a tar file to ship ...
# on the destination
# ... unpack scripts and $dir from tar ...
regctl image copy ocidir://$dir:tag $dest