为了获得越来越小的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
的多层?这可能是为了使人们可以更好地利用other映像中的层,因为Docker将在映像之间共享相同的层,如果它们相同,则可以节省服务器上的空间并加快构建和拉动。