J. *_*osa 5 yum docker dockerfile docker-image
我已经使用 Docker 一段时间了,但我没有 IT 背景。
\n现在,我正在努力了解如何通过优化 Dockerfile 来最小化 docker 映像的大小。从这个意义上说,我遇到了一个我不理解的最小可重现案例。如果有人可以分享他的想法或提供解释,我将非常高兴。
\n我从官方 centos:7 映像(7e6257c9f8d8;203MB)开始。然后,我准备以下 Dockerfile:
\nFROM 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\nRun Code Online (Sandbox Code Playgroud)\n这个想法是安装任何轻量级包并评估对图像大小的影响。为此,我首先安装nano,然后安装不同的标签。我添加了额外的安装尝试(这表明没有什么可做的)。此外,我添加了yum clean all语句来清理 yum 缓存,并且为了以防万一(即使我刚刚检查了如果删除此命令,实验结果不会改变),我删除了 /var/cache 目录(在基础图像)。
\n结果如下:
\nIMAGE 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\nRun Code Online (Sandbox Code Playgroud)\n其中nano安装大小为75k, nano安装大小为1.6M。我没有识别任何其他已安装的依赖项。
\n问题是:为什么即使没有实际安装任何软件包,这些安装命令中的每一个都会将最终映像增加约 24MB 层?
\n预先感谢社区:)
\n每条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
| 归档时间: |
|
| 查看次数: |
3039 次 |
| 最近记录: |