首页/开发/CI/CD 与发布速查/BuildKit 缓存导出与复用
构建与制品管理58 条

BuildKit 缓存导出与复用

把构建缓存导出到镜像仓库或共享后端(--cache-to/--cache-from):换机器、换流水线也能吃到缓存,构建显著提速。

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

BuildKit 缓存复用是什么

把构建缓存导出到镜像仓库或共享后端(--cache-to / --cache-from):换机器、换流水线也能吃到缓存,构建显著提速。BuildKit 是 buildx 的默认构建引擎;缓存可以随镜像内联(inline),也可以独立导出到 registry。前者简单但保留有限,后者 mode=max 能含中间层,适合多阶段构建。

基本信息

方式registry 缓存(mode=max 含中间层)、inline(随镜像附带,能力有限)、CI 平台缓存后端
命令docker buildx build --cache-from type=registry,ref=... --cache-to type=registry,ref=...,mode=max
平台GitHub Actions 可用 --cache-to type=gha
命中条件指令与文件内容一致,命中后跳过对应构建步骤
体积缓存独立于镜像:用单独命名空间与清理策略

典型使用场景

  • 多阶段构建:依赖层与编译层分离,最大化缓存复用
  • 多 Runner:缓存推到 registry,弹性机也能复用
  • CI 提速:冷启动机器不再从零编译
  • 分支隔离:按分支或目标使用不同缓存命名,避免串味
  • 平台缓存:GitHub Actions 用 gha 后端简化配置
  • 缓存治理:定期清理旧缓存,控制仓库增长

实践要点

  • 缓存键设计:基础镜像、依赖清单与构建参数变动要能失效
  • 先拉后推:构建开始先 cache-from,结束再 cache-to
  • 命名隔离:缓存 tag 与发布 tag 分开,避免互相覆盖
  • 命中验证:看日志里的 CACHED 标记确认生效
  • 体积监控:mode=max 缓存可观,设容量与清理策略
  • 依赖顺序:变化最频繁的层放在构建文件后段
  • 失败隔离:缓存损坏时允许回退全量构建,别卡死流水线

registry 缓存

registry 缓存
docker buildx build \
  --cache-from type=registry,ref=registry.example.com/app:buildcache \
  --cache-to type=registry,ref=registry.example.com/app:buildcache,mode=max \
  -t registry.example.com/app:1.8.0 --push .

缓存方式对照

方式保留范围适用
inline随镜像的最终层简单场景
registry mode=min导出的少量层基础复用
registry mode=max全部中间层多阶段构建
gha 后端平台缓存服务GitHub Actions
缓存导出体积可观:registry 侧为缓存镜像设置独立的清理策略。
命中与否看日志:CACHED 标记出现即命中,没有就先检查键与来源。

易错点

  • mode=min 的缓存缺中间层:复杂多阶段构建命中率低,按需改 max
  • 缓存与制品共用同一 tag:清理策略混淆,使用独立命名空间
  • 只配 cache-to 不配 cache-from:每次构建仍从零开始,两端都要配
  • 缓存键过宽导致陈旧:构建参数变化未反映到键里,产出与预期不符
  • 缓存不一致诊断缺日志:开启构建进度输出定位命中位置,别盲猜
  • 缓存从小变大不加清理:容量与成本悄悄上升,纳入容量告警

数据来源与参考

  • Docker Docs《Build cache》
  • Buildx 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌