有没有办法优化/加速从tar文件加载docker镜像?

问题描述 投票:0回答:1

我有一个

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
中完成可能的改进。

更新:请在下面找到有关如何保存、加载、重新标记和推送图像的过程。如果需要更多信息,请评论。

  • 触发 Jenkins 作业,该作业将从内部注册表中提取 Docker 映像并将这些映像保存为
    docker.tar
    文件
  • 此 tar 文件随后与 bash 脚本一起打包(最终将加载、重新标记这些映像并将其推送到新的注册表)到 CSAR 包中: https://wiki.onap.org/display/DW/Csar+Structure
  • 外部用户将获得该包 - 然后他们将解压 CSAR 包
  • 从这里,他们将运行提供的脚本以从
    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

bash docker
1个回答
0
投票

在这种情况下不需要使用

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
© www.soinside.com 2019 - 2024. All rights reserved.