Dockerfile:重复 apt 缓存清理的好处
Dockerfile: Benefits of repeated apt cache cleans
在寻求更小的 Docker 图像时,通常会在安装包后删除 apt
(对于基于 Debian/Ubuntu 的图像)缓存。像
RUN rm -rf /var/lib/apt/lists/*
我见过几个 Dockerfile
s 在每个软件包安装后完成 (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 在服务器上并加速构建和拉取。
在寻求更小的 Docker 图像时,通常会在安装包后删除 apt
(对于基于 Debian/Ubuntu 的图像)缓存。像
RUN rm -rf /var/lib/apt/lists/*
我见过几个 Dockerfile
s 在每个软件包安装后完成 (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 在服务器上并加速构建和拉取。