我注意到,对于许多基于 Debian/ubuntu 的 docker 镜像,apt-get update
在安装任何软件包之前,您必须执行 。缓存已完全清除。我觉得在我执行 之后,我应该自己做同样的事情RUN apt-update && apt-get install -y whatever
。我不知道该怎么做。有命令吗,还是我只需要rm -rf
q 文件夹?
答案1
构建 docker 镜像时,您会尝试使其尽可能小。因此,构建镜像并安装软件包的人会删除缓存以使其保持较小。结果是,apt-get update
如果您想安装任何软件包,就必须运行。
由于每个执行的 docker 命令都会产生一个层,并且其内容将“永远”保留在那里,因此一旦完成安装包,您也需要删除缓存。
可以通过以下两种方式之一来实现:
rm -rf /var/cache/apt/archives /var/lib/apt/lists/*
。
或者
apt-get clean
清除本地存储库中已检索到的软件包文件。它将删除 /var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/ 中除锁定文件之外的所有内容。
(来源:手册页)
答案2
rm -rf /var/lib/apt/lists/*
它位于Docker 最佳实践:
当您通过删除 apt 缓存来清理
/var/lib/apt/lists
它时,会减小图像大小,因为 apt 缓存不存储在层中。
/var/cache/apt/archives
其中没有太多数据。比较du
这两个目录。
答案3
正如所说在 David 的回答中,您通常会apt-get clean
或rm -rf /var/cache/apt/archives
。这将删除包缓存,根据手动的,包含下载的包本身。
然而,根据 Docker 的最佳实践,apt-get clean
在任何官方 Ubuntu/Debian 映像上都为您完成。
在这种情况下,唯一需要清理的是存储库索引缓存:你会只需
rm -rf /var/cache/apt/lists
。
答案4
虽然您可以删除 apt 缓存以释放空间(如其他答案中所述),但这样做的缺点是,每当需要重建该步骤时,都需要再次重建缓存。如果您使用构建工具(例如如果你使用Docker buildx或者如果你在 Docker 版本 23 以上版本中使用默认的 Docker 构建器)使用缓存挂载。这些不仅适用于 apt 缓存,还适用于其他包管理器的缓存(例如:pip、gem、go、npm),甚至编译器缓存(例如:ccache)。
例如:
# syntax=docker/dockerfile:1
RUN --mount=type=cache,target=/var/cache/apt \
--mount=type=cache,target=/var/lib/apt \
apt-get update && apt-get install ...
请注意,没有必要保留rm
apt 缓存的内容,因为它不会出现在最终映像中。但它将保留在构建系统中,以供下次构建时使用。
笔记:此外,您可能需要考虑使用id
和sharing
缓存挂载选项来隔离这些缓存,以防您正在为使用 apt 的多个环境构建(例如:Debian 与 Ubuntu,或它们的不同版本)。
最后,如果你在 Docker 构建中遇到缓存问题,请记住,你可以使用以下方法禁用特定构建的缓存:--no-cache
旗帜或--no-cache-filter
旗帜。您还可以使用以下命令清理系统中的构建缓存docker buildx prune