Dockerfile:重复 apt 缓存清理的好处

Dockerfile: Benefits of repeated apt cache cleans

在寻求更小的 Docker 图像时,通常会在安装包后删除 apt(对于基于 Debian/Ubuntu 的图像)缓存。像

RUN rm -rf /var/lib/apt/lists/*

我见过几个 Dockerfiles 在每个软件包安装后完成 (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/*

第一个 运行 命令生成一个包含列表的层,任何使用您的图像的人都会将其拉出,即使下一个命令删除了这些文件(因此它们不可访问)。最终那些额外的文件只是浪费 space 和时间。

另一方面,

RUN apt-get update && rm -rf /var/lib/apt/lists/*

在单层中执行,这些列表在层完成之前被删除,因此它们永远不会作为图像的一部分被推送或拉出。

那么,为什么有多个图层使用 apt-get install?这可能是为了让人们可以更好地利用 other 图像中的图层,因为 Docker 将在图像之间共享图层(如果它们相同)以节省 space 在服务器上并加速构建和拉取。