在寻求越来越小的Docker镜像时,通常在安装软件包后删除apt
(对于基于Debian / Ubuntu的镜像)缓存。就像是
RUN rm -rf /var/lib/apt/lists/*
我已经看到了几个
Dockerfile
,其中在每个软件包安装(example)之后完成此操作,即使用模式# Install some package
RUN apt-get update \
&& apt-get install -y <some-package> \
&& rm -rf /var/lib/apt/lists/*
# Do something
...
# Install another package
RUN apt-get update \
&& apt-get install -y <another-package> \
&& rm -rf /var/lib/apt/lists/*
# Do something else
...
这样做有什么好处,而不是只在最后清理
apt
缓存(因此一开始只更新一次)?对我来说,似乎必须多次删除并update
缓存只会减慢图像生成速度。 最佳答案
人们这样做的主要原因是最大程度地减少了存储在该特定docker层中的数据量。拉取docker镜像时,必须拉取图层的全部内容。
例如,想象一下图像中的以下两层:
RUN apt-get update
RUN rm -rf /var/lib/apt/lists/*
第一个RUN命令产生一个包含列表的层,即使下一个命令删除了这些文件(因此它们不可访问),使用该图像的任何人都将始终将其拉出。最终,这些多余的文件只是浪费时间和空间。
另一方面,
RUN apt-get update && rm -rf /var/lib/apt/lists/*
在单层中进行操作时,这些列表会在层完成之前被删除,因此它们永远不会作为图像的一部分被推入或拉出。
那么,为什么要使用
apt-get install
的多层呢?这很可能使人们可以更好地利用其他镜像中的层,因为Docker将在镜像之间共享相同的层,以节省服务器上的空间并加快构建和拉动。关于docker - Dockerfile:重复进行apt缓存清理的好处,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61990329/