在寻求越来越小的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/

10-15 23:41