yum install 对 Docker 层大小的影响

J. *_*osa 5 yum docker dockerfile docker-image

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

\n

现在,我正在努力了解如何通过优化 Dockerfile 来最小化 docker 映像的大小。从这个意义上说,我遇到了一个我不理解的最小可重现案例。如果有人可以分享他的想法或提供解释,我将非常高兴。

\n

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

\n
FROM centos:7\nRUN yum -y install nano && yum -y clean all && rm -fr /var/cache\nRUN yum -y install which && yum -y clean all && rm -fr /var/cache\nRUN yum -y install which && yum -y clean all && rm -fr /var/cache\n
Run Code Online (Sandbox Code Playgroud)\n

这个想法是安装任何轻量级包并评估对图像大小的影响。为此,我首先安装nano,然后安装不同的标签。我添加了额外的安装尝试(这表明没有什么可做的)。此外,我添加了yum clean all语句来清理 yum 缓存,并且为了以防万一(即使我刚刚检查了如果删除此命令,实验结果不会改变),我删除了 /var/cache 目录(在基础图像)。

\n

结果如下:

\n
IMAGE               CREATED             CREATED BY                                      SIZE  \n6a14537d3460        7 seconds ago       /bin/sh -c yum -y install which && yum -y cl\xe2\x80\xa6   23.9MB\n7d924cbdf819        22 seconds ago      /bin/sh -c yum -y install which && yum -y cl\xe2\x80\xa6   24.2MB\n2b5b04d37a64        42 seconds ago      /bin/sh -c yum -y install nano && yum -y cle\xe2\x80\xa6   24.6MB\n
Run Code Online (Sandbox Code Playgroud)\n

其中nano安装大小为75k, nano安装大小为1.6M。我没有识别任何其他已安装的依赖项。

\n

问题是:为什么即使没有实际安装任何软件包,这些安装命令中的每一个都会将最终映像增加约 24MB 层?

\n

预先感谢社区:)

\n

Ale*_* Yu 3

每条RUN指令都会创建新的 docker 层。

Docker 本身还不够聪明,无法检测到该指令实际上什么也没做。

它忠实地将新的 docker 层存储在生成的映像中。

这就是为什么您需要尽可能减少 docker 指令的数量。

在您的情况下,您可以只使用一个RUN指令:

RUN yum -y install nano which && yum -y clean all && rm -fr /var/cache 
Run Code Online (Sandbox Code Playgroud)

更新

我们来做个实验:

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
Run Code Online (Sandbox Code Playgroud)

10 个 RUN 指令,其中 9 个“不执行任何操作”。

让我们构建并寻找中间图像

RUN yum -y install nano which && yum -y clean all && rm -fr /var/cache 
Run Code Online (Sandbox Code Playgroud)

我看到“什么都不做”的每个下一个 docker 镜像层都会增加约 2Mb。(我不知道OP问题中的~24 Mb)

更新2

根据emix的建议:使用 div我立即发现文件中的每一层都发生了/var/rpm变化/var/log