yum安装对Docker层大小的影响
我已经使用Docker一段时间了,但我没有IT背景 现在,我正在努力了解如何通过优化docker文件来最小化docker图像的大小。从这个意义上说,我遇到了一个我不理解的最小可复制的情况。如果有人能分享他的想法或提供解释,我将非常高兴 我从官方的centos:7图像(7e6257c9f8d8;203MB)开始。然后,我准备以下Dockerfile:yum安装对Docker层大小的影响,docker,dockerfile,yum,docker-image,Docker,Dockerfile,Yum,Docker Image,我已经使用Docker一段时间了,但我没有IT背景 现在,我正在努力了解如何通过优化docker文件来最小化docker图像的大小。从这个意义上说,我遇到了一个我不理解的最小可复制的情况。如果有人能分享他的想法或提供解释,我将非常高兴 我从官方的centos:7图像(7e6257c9f8d8;203MB)开始。然后,我准备以下Dockerfile: FROM centos:7 RUN yum -y install nano && yum -y clean all &&am
FROM centos:7
RUN yum -y install nano && yum -y clean all && rm -fr /var/cache
RUN yum -y install which && yum -y clean all && rm -fr /var/cache
RUN yum -y install which && yum -y clean all && rm -fr /var/cache
其想法是安装任何轻量级软件包,并评估对图像大小的影响。为此,我首先安装nano,然后安装在不同的标签中。我添加了一个额外的安装尝试(这表明无需执行任何操作)。此外,我添加了用于清理yum cache的yum clean all语句,并且为了以防万一(尽管我刚刚检查了如果删除此命令,实验结果不会发生变化),我删除了/var/cache dir(在基本映像中为空)
结果如下:
IMAGE CREATED CREATED BY SIZE
6a14537d3460 7 seconds ago /bin/sh -c yum -y install which && yum -y cl… 23.9MB
7d924cbdf819 22 seconds ago /bin/sh -c yum -y install which && yum -y cl… 24.2MB
2b5b04d37a64 42 seconds ago /bin/sh -c yum -y install nano && yum -y cle… 24.6MB
其安装尺寸为75k,nano安装尺寸为1.6M。我没有发现任何其他已安装的依赖项
问题是:为什么即使没有实际安装软件包,这些安装命令中的每一个都会将最终映像增加约24MB层?
提前感谢社区:)每个
运行
指令都会创建新的docker层
Docker本身不够聪明,无法检测到指令实际上什么都没做
它忠实地将新的docker层存储在生成的图像中
这就是为什么您需要尽可能减少docker指令的数量
在您的情况下,您可以只使用一个RUN
指令:
RUN yum -y install nano which && yum -y clean all && rm -fr /var/cache
更新
让我们做一个实验:
FROM centos
RUN yum -y install which
RUN yum -y install which
RUN yum -y install which
RUN yum -y install which
RUN yum -y install which
RUN yum -y install which
RUN yum -y install which
RUN yum -y install which
RUN yum -y install which
RUN yum -y install which
10条运行指令,其中9条“什么也不做”
让我们构建并寻找中间图像
$docker构建。
...
$docker图像-a
创建的存储库标记图像ID大小
fbd86aedc782 5秒前263MB
ca70a4bbe722 7秒前261MB
bd11e0ab02fb 9秒前259MB
68c20ddfcaad 11秒前257MB
314a6501ad23 13秒前255MB
42a62294a5e7 16秒前253MB
16fad39b9c27 18秒前251MB
6769fe69c9e1 19秒前249MB
49cef483e732 21秒前248MB
c4c92c39f2a4 23秒前246MB
centos最新0d120b6ccaa8 3周前215MB
我看到“无所事事”的下一个docker图像层增加了~2Mb。
(我不知道有问题的大约24MB)
更新2
根据:Using的建议,我立即在
/var/rpm
和/var/log
中找到了每一层都已更改的文件,谢谢Alex。当然,将这三条指令作为三个不同的步骤运行是没有意义的。这只是一个研究docker行为的有用例子。你的意思是说,这些~24MB是添加一个(几乎)空层的内在额外大小吗?@J.Berzosa我的实验在yum install
中为每层提供2MB,而在touch/some_file&&rm/some_file
中为每层提供更少的容量,但这是docker存储层的内在特性。只需重复你的实验,复制并粘贴你的docker文件。在我的例子中,第一层实际安装需要30.6MB,而其他层需要10.3MB(在你的例子中,只有2MB…)。我在Centos中运行docker。刚刚验证了执行“触摸kk”需要0B。因此,我们观察到的不可能是Docker图像层本身的固有大小。只需使用检查图像层即可。