我如何删除 apt 包索引?

我如何删除 apt 包索引?

我注意到,对于许多基于 Debian/ubuntu 的 docker 镜像,apt-get update在安装任何软件包之前,您必须执行 。缓存已完全清除。我觉得在我执行 之后,我应该自己做同样的事情RUN apt-update && apt-get install -y whatever。我不知道该怎么做。有命令吗,还是我只需要rm -rfq 文件夹?

答案1

构建 docker 镜像时,您会尝试使其尽可能小。因此,构建镜像并安装软件包的人会删除缓存以使其保持较小。结果是,apt-get update如果您想安装任何软件包,就必须运行。

由于每个执行的 docker 命令都会产生一个层,并且其内容将“永远”保留在那里,因此一旦完成安装包,您也需要删除缓存。

可以通过以下两种方式之一来实现:

  1. rm -rf /var/cache/apt/archives /var/lib/apt/lists/*

或者

  1. 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 cleanrm -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 ...

请注意,没有必要保留rmapt 缓存的内容,因为它不会出现在最终映像中。但它将保留在构建系统中,以供下次构建时使用。

笔记:此外,您可能需要考虑使用idsharing缓存挂载选项来隔离这些缓存,以防您正在为使用 apt 的多个环境构建(例如:Debian 与 Ubuntu,或它们的不同版本)。

最后,如果你在 Docker 构建中遇到缓存问题,请记住,你可以使用以下方法禁用特定构建的缓存:--no-cache旗帜或--no-cache-filter旗帜。您还可以使用以下命令清理系统中的构建缓存docker buildx prune

相关内容