缓存挂载是什么
BuildKit 的 RUN --mount=type=cache 把包管理器与编译器缓存目录挂进单个构建步骤:既加速重复构建,又不会写进镜像层。它与分层缓存互补——分层缓存复用「步骤的结果」,缓存挂载维持「工具内部缓存的连续性」,适合 go-build、pip、apt、npm 这类渐进式缓存。
基本信息
| 适用平台 | BuildKit(docker buildx 等);经典构建器不支持该语法 |
|---|---|
| 语法 | RUN --mount=type=cache,target=<路径> ... |
| 常见目标 | apt 包缓存、pip 缓存、Go 构建缓存、npm 缓存 |
| 特点 | 缓存由 BuildKit 管理,不落入最终镜像 |
典型使用场景
- 语言构建提速:go-build、Cargo target、npm/pip 缓存在 CI 间复用
- 系统包安装:apt 包缓存避免每次构建重复下载
- 多阶段构建:保持编译中间产物的增量信息
- PR 构建加速:把编译缓存共享给特性分支使用
- 体积控制:缓存不落镜像,产物保持精简
- 构建调试提速:缓存命中时跳过重复执行,缩短「改一点、反复重建」的迭代周期
示例
示例
RUN --mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/go/pkg/mod \
go build -o /out/app ./cmd/app # 两类缓存都不进镜像
# npm 场景:优先用本地缓存,减少网络等待
RUN --mount=type=cache,target=/root/.npm npm ci --prefer-offline缓存命中率取决于后端:CI 环境重建后缓存是冷的,别把构建时长押在「缓存一定命中」上,先保证冷缓存也能走通。
并行构建共享缓存要选对 sharing 模式:默认 shared 适合读多写少,写入互踩时改用 locked 或 private。
常见缓存目标路径
| 生态 | 常见缓存目录 | 备注 |
|---|---|---|
| Go | /root/.cache/go-build 与 /go/pkg/mod | 编译缓存与模块缓存分开挂载 |
| npm | /root/.npm | 配合 --prefer-offline 减少网络等待 |
| pip | /root/.cache/pip | 与哈希校验并行存在 |
| apt | 包缓存与索引目录 | 同一步骤内一并挂载 |
| Cargo | 注册表与编译目录 | Rust 依赖与增量编译 |
缓存不是永久的:环境销毁或缓存后端清理后冷启动变慢属于正常现象,把容量与命中率一起监控,别等构建大面积变慢才发现后端换了。