引言
这是无关如何制作最小化Docker镜像的第二篇文章,在之前的文章中,我谈到了如何创立最小化的Docker镜像,然而能够制作镜像的大小其实是有限度的,我概述了一种使增加到Docker镜像中的layer层变小的办法,但有时可能无奈做到,兴许须要依照特定的程序运行一些额定的步骤。
比方上面这个例子,须要在两头的步骤中增加一个文件:
RUN ...ADD some_file /RUN ...
如果我须要在增加文件之前在第一个RUN命令中进行一些解决,而后在第二个RUN命令中进行一些清理之前进行更多解决,该怎么办? 在这种状况下,很不背运的是,Docker将在每个命令之后创立一个layer层,而且可能还会遇到以下辣手的状况:要应用的根底镜像继承自许多其余镜像,并且每个镜像都增加了本人很大的layer层。
Docker Squash
Docker没有提供一种将运行的命令与layer层缓存拆散的办法,实践上这能够做到,但这会导致镜像过大。 为了缩小层的数量及其大小,能够像压缩git commit一样压缩layer层。 有一个十分酷的工具称为docker-squash能够执行此操作, 您能够在作者的原始文章中理解无关此内容的更多信息。
Docker squash将压缩多个镜像layer层,以便删除存储在两头步骤中的所有数据,当遇到上述情况时,这真的很棒,或者说如果你想让Dockerfile变得不那么简单,就去试一试吧。
Squashing Python
我想看看是否能够放大docker hub上的规范python:2.7.11图像,从Dockerfile中留神到,首先要革除以后装置的Debian python,而后再下载并编译本人的版本。 然而,因为Debian python已蕴含在较早的一层中,因而该空间已被咱们的镜像占用,这些镜像还取决于其余几个Dockerfile,每个Dockerfile都增加了本人的层。 让咱们看看通过squashing能够节俭多少空间。
首先将python:2.7.11的镜像pull到本地
$ docker pull python:2.7.112.7.11: Pulling from library/python7a01cc5f27b1: Pull complete 3842411e5c4c: Pull complete ...127e6c8b9452: Pull complete 88690041a8a3: Pull complete Digest: sha256:590ee32a8cab49d2e7aaa92513e40a61abc46a81e5fdce678ea74e6d26e574b9Status: Downloaded newer image for python:2.7.11
能够看到该镜像具备很多层,大小约为676MB。
$ docker images python:2.7.11REPOSITORY TAG IMAGE ID CREATEDVIRTUAL SIZEpython 2.7.11 88690041a8a3 2 weeks ago676.1 MB
docker-squash不容许压缩本地镜像仓库中的镜像,这点令人讨厌。 相同,它要求将镜像导出为文件,接下来持续操作,并创立一个新的squashed镜像。
$ docker save python:2.7.11 > python-2.7.11.tar$ sudo bin/docker-squash -i python-2.7.11.tar -o python-squashed-2.7.11.tar
当初能够看到新文件放大了约75MB。
~$ ls -lh python-*.tar-rw-rw-r-- 1 ian ian 666M Feb 15 16:32 python-2.7.11.tar-rw-r--r-- 1 root root 590M Feb 15 16:33 python-squashed-2.7.11.tar
在将其从新加载到本地镜像仓库中之后,再次查看镜像大小发现小了很多:
$ cat python-squashed-2.7.11.tar | docker load$ docker images python-squashedREPOSITORY TAG IMAGE ID CREATEDVIRTUAL SIZEpython-squashed latest 18d8ebf067fd 11 days ago599.9 MB
Virtual Size
你会留神到,只管docker向咱们显示了镜像的“虚构大小”,那是因为Docker重用了依赖于雷同层的镜像,就像git commit的形式以及批改或squashing提交的形式一样,这是一个全新的提交形式,docker-squash将创立一个蕴含所有内容的全新的独立层。
Docker-squash容许你通过提供-from参数来解决这种状况,此参数的默认值是第一个FROM层。 下面的状况是这样,因为有许多FROM层,所以它可能压缩掉一些不必要的数据,但仍从根底镜像来到该层,通过指定此参数,能够决定要应用哪个根底镜像,这样就不用每次都去下载。
$ docker-squash -from 18d8ebf067fd -i ... -o ...
Docker-squash不是万能药,但的确为你的工具箱增加了一个工具用于治理Docker镜像大小。在接下来的两篇文章中,我将探讨一些其余工具和办法来减小Docker镜像的大小。