首页 > 解决方案 > Dockerfile:重复 apt 缓存清理的好处

问题描述

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

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

我已经看到了一些Dockerfile在每个软件包安装后完成的操作(示例),即使用模式

# 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多次删除和缓存只会减慢图像构建速度。

标签: dockerubuntudebiandockerfileapt

解决方案


人们这样做的主要原因是尽量减少存储在特定 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 将在镜像之间共享层,以节省服务器空间并加快构建和拉取速度。


推荐阅读