docker - 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
多次删除和缓存只会减慢图像构建速度。
解决方案
人们这样做的主要原因是尽量减少存储在特定 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 将在镜像之间共享层,以节省服务器空间并加快构建和拉取速度。
推荐阅读
- sql - 在 Microsoft SQL Server 上插入触发器后 -- 更新新创建记录中的列
- php - 在php中转换字符串表达式
- c# - Unity 服务器端 C# 脚本在运行时加载
- javascript - 向从下拉列表填充的跨度添加和删除文本
- nuxt.js - nuxt-community/starter-template 和 create-nuxt-app 有什么关系?
- r - 在 R 3.5.1 中使用什么代码来计算每个唯一 var1 的唯一 var2 的数量?
- java - 在 gui java 中上传大的 .xlsx 文件
- function - 组合 Workday.Intl 和 IF 函数
- java - 在 Java 控制台应用程序中使用 smali 代码
- playframework - 当我尝试在 play framework 1.4.3 上本地安装模块 Gae 和 Siena 时出错