Docker构建器缓存(Builder-Cache)
Docker 构建器缓存的工作原理、占用空间原因和清理思路。
#status / growing
#type / concept
#tech / ops
Docker构建器缓存(Builder-Cache)
[!info] related notes
- 相关概念: Docker, 构建Excalidraw的容器, docker创建开发测试数据库
🏗️ 详细讲解:Docker 构建器缓存 (Builder Cache)
1. 什么是构建器缓存?
Docker 构建器缓存是 Docker 在执行 docker build 或 docker 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): 包含所有构建过程中产生的中间层和未被引用的缓存对象。即使最终镜像很小,中间构建步骤如果复制了大量文件,也会在缓存中留下痕迹。
- 已下载镜像 (Images): 是最终可运行的、有标签的镜像文件,这些是您运行
3. 为什么缓存会有 91GB?
您的 bigbluebutton 项目是典型的大型应用,它使用多阶段构建,极有可能导致大量的缓存积累:
- 频繁构建与更新 (
--build): 如果您在过去几个月内频繁地进行开发、测试和更新,并且每次都使用--build标志,Docker 就会不断创建和存储新的缓存层。 - 构建环境庞大:
bbb-build镜像:bigbluebutton/bbb-build基础镜像本身就包含了一个完整的编译环境(如 Node.js、Java、各种开发库)。这个环境通常很大。- 源文件和依赖复制: 在构建阶段,Dockerfile 可能包含
COPY或RUN npm install等指令,这些操作涉及复制、下载和编译大量文件和依赖包。这些操作产生的中间状态都会成为巨大的缓存层。
- 长时间未清理: 您的缓存列表中显示了很多缓存项是 6 个月前、7 个月前创建的。长时间不清理,缓存就会像滚雪球一样积累起来。
4. docker builder prune -f 的作用和结果
您在第二个截图的底部看到了清理结果:
Total: 91.07KB