Docker构建器缓存(Builder-Cache)

Docker 构建器缓存的工作原理、占用空间原因和清理思路。

#status / growing #type / concept #tech / ops

Docker构建器缓存(Builder-Cache)

[!info] related notes

🏗️ 详细讲解:Docker 构建器缓存 (Builder Cache)

1. 什么是构建器缓存?

Docker 构建器缓存是 Docker 在执行 docker builddocker compose build 时,为了加速重复构建过程而创建和存储的中间层数据。 在 Dockerfile 中,每一条指令(如 FROM, RUN, COPY 等)都会创建一个临时的构建缓存层(Build Cache Layer)。

  • 加速构建: 当您第二次尝试构建一个镜像时,Docker 会检查 Dockerfile 中的指令是否发生变化。如果没有,它会直接重用对应的缓存层,而不是重新执行该指令,从而大幅节省时间和资源。
  • 多阶段构建 (Multi-Stage Builds): 在多阶段构建中,第一个阶段(通常是 builder 阶段)会产生大量的中间文件和依赖项。这些中间层都会被存储在构建缓存中。

2. 构建器缓存占用的空间

是的,它直接占用您的磁盘空间

  • 存储位置: 构建缓存数据通常存储在 Docker 根目录(默认为 /var/lib/docker/)下的 buildkit 或类似的缓存目录中。
  • 占用类型: 它占用的是您的主存储设备(无论是 SSD 固态硬盘还是 HDD 机械硬盘)。既然您是在生产环境服务器上,这 91GB 的缓存直接消耗了您的服务器磁盘空间。
  • 缓存 vs. 镜像:
    • 已下载镜像 (Images): 是最终可运行的、有标签的镜像文件,这些是您运行 docker images 时看到的。
    • 构建缓存 (Builder Cache/Buildkit Cache): 包含所有构建过程中产生的中间层未被引用的缓存对象。即使最终镜像很小,中间构建步骤如果复制了大量文件,也会在缓存中留下痕迹。

3. 为什么缓存会有 91GB?

您的 bigbluebutton 项目是典型的大型应用,它使用多阶段构建,极有可能导致大量的缓存积累:

  1. 频繁构建与更新 (--build): 如果您在过去几个月内频繁地进行开发、测试和更新,并且每次都使用 --build 标志,Docker 就会不断创建和存储新的缓存层。
  2. 构建环境庞大:
    • bbb-build 镜像: bigbluebutton/bbb-build 基础镜像本身就包含了一个完整的编译环境(如 Node.js、Java、各种开发库)。这个环境通常很大。
    • 源文件和依赖复制: 在构建阶段,Dockerfile 可能包含 COPYRUN npm install 等指令,这些操作涉及复制、下载和编译大量文件和依赖包。这些操作产生的中间状态都会成为巨大的缓存层。
  3. 长时间未清理: 您的缓存列表中显示了很多缓存项是 6 个月前7 个月前创建的。长时间不清理,缓存就会像滚雪球一样积累起来。

4. docker builder prune -f 的作用和结果

您在第二个截图的底部看到了清理结果:

Total: 91.07KB
创建于 2025/12/16 更新于 2026/5/27