首页/开发/CI/CD 与发布速查/构建缓存挂载(cache mounts)
构建与制品管理58 条

构建缓存挂载(cache mounts)

把包管理器与编译缓存目录挂进 RUN 步骤:加速重复构建且不进入镜像层,避免把缓存体积带进产物。

CI/CD 与发布速查开发更新于 2026-10-13

缓存挂载是什么

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 依赖与增量编译
缓存不是永久的:环境销毁或缓存后端清理后冷启动变慢属于正常现象,把容量与命中率一起监控,别等构建大面积变慢才发现后端换了。

易错点

  • 缓存目录跨用户与权限复用:出现权限报错时换 target 路径或对齐 uid
  • 把「必须每次重建的步骤」也缓存:结果陈旧,注意缓存语义边界
  • apt 与包索引不同步:只挂包缓存不挂索引会 404,规范做法是把 apt 相关目录一并挂载
  • 把敏感内容留在缓存里:构建密钥经缓存挂载传递时用完即清,避免随缓存后端持久化
  • 缓存键不分构建变体:调试与发布构建共用目录互相覆盖,按变体拆分目标路径

数据来源与参考

  • Docker Docs《BuildKit cache mounts》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌