压缩 Docker 镜像而不启动容器

4
我正在使用docker分析各种命令引起的文件系统变化。我只需在Dockerfile中添加相关的RUN行,构建它,使用docker save查看所做的更改。不幸的是,我使用了许多命令,即使大多数时候我可以将它们放入一个层中,但通常会超过相当低的127个父层限制。
为了解决这个问题,我将具有多个层的镜像压缩成仅具有一个层的镜像,并使用生成的镜像作为其余新层的父级。最好的方法是启动容器,然后使用docker export,然后使用docker import来获取漂亮的单个更改层。我正在寻找缩短执行该操作所需时间的方法。
是否有一种简单的方法可以完成相同的操作(导出镜像的完全扩展文件系统,而不仅仅是像docker save中的层堆栈)而不需要启动容器?
1个回答

3
无论使用何种方法,压缩完整的容器总是需要读取分层文件系统并编写新的平坦文件系统的过程,这涉及io,相对较慢。 相比之下,创建容器非常轻量级,因此我不确定通过摆脱该步骤能够获得多少收益。
time container=$(docker create debian)
time docker export $container | docker import -  debian_flat
time docker rm $container

在基于固态硬盘的系统上,结果为:
创建
real    0m0.050s
user    0m0.015s
sys     0m0.010s

导出/导入

real    0m8.213s
user    0m2.867s
sys     0m0.768s

移除

real    0m0.019s
user    0m0.007s
sys     0m0.008s

还有其他工具可以让您压缩选定的图层。这可能会节省时间,因为您只需要读取和写入部分数据。如果您的要求是压缩完整的图像,那么我不确定这比导出/导入更快,因为您仍然需要读取和写入相同数量的数据。

官方Docker中有一个github问题来涵盖压缩功能,以及拉取请求支持直接压缩或平铺Docker和构建中的层。每个请求似乎在被接受之前都会慢慢消失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接