Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
yum安装对Docker层大小的影响_Docker_Dockerfile_Yum_Docker Image - Fatal编程技术网

yum安装对Docker层大小的影响

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

我已经使用Docker一段时间了,但我没有IT背景

现在,我正在努力了解如何通过优化docker文件来最小化docker图像的大小。从这个意义上说,我遇到了一个我不理解的最小可复制的情况。如果有人能分享他的想法或提供解释,我将非常高兴

我从官方的centos:7图像(7e6257c9f8d8;203MB)开始。然后,我准备以下Dockerfile:

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图像层本身的固有大小。只需使用检查图像层即可。