首页/云/Docker 容器速查/RUN --mount=type=cache 构建缓存挂载
镜像与构建107 条

RUN --mount=type=cache 构建缓存挂载

把包管理器的下载缓存挂载进构建步骤:缓存不写入镜像层,多次构建之间可复用,显著减少重复下载。

Docker 容器速查云更新于 2026-10-13

缓存挂载是什么

RUN --mount=type=cache 把包管理器的下载缓存挂进构建步骤:缓存保存在构建器内部,不写进镜像层,多次构建之间可复用,因此能明显减少重复下载。它需要 BuildKit 支持,新版 Docker 默认开启。

基本信息

用途加速依赖安装(apt、pip、npm、go 等)
语法RUN --mount=type=cache,target=/root/.cache/pip 命令
依赖BuildKit 与较新的 Dockerfile 语法版本
缓存位置构建器内部,不写入镜像层
CI 复用配合 buildx 的 cache-to、cache-from,或复用同一构建器实例

典型使用场景

  • pip 反复下载 wheel:挂上缓存目录后,改依赖清单时只下载变化的部分
  • npm 构建安装依赖复用下载缓存,避免每次都全量拉取
  • apt 安装大量包时复用已下载的 deb 包,缩短构建时间
  • Go 模块下载缓存复用,配合 go mod download 效果明显
  • 既要加速构建又不希望缓存进镜像,缓存挂载正好满足这两点
  • 为不同项目加不同 id,避免同类缓存互相覆盖导致命中率下降

示例

示例
# pip:挂缓存目录,注意此时不要再写 --no-cache-dir
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install -r requirements.txt

# npm:复用下载缓存
RUN --mount=type=cache,target=/root/.npm \
    npm ci --prefer-offline

# 给缓存单独指定 id,避免与其他项目的同类缓存互相干扰
RUN --mount=type=cache,id=apt,target=/var/cache/apt \
    apt-get update && apt-get install -y --no-install-recommends ca-certificates

与普通层缓存的差别

维度--mount=type=cache普通层缓存
缓存归属构建器内部,不写进镜像写进镜像层
失效方式按 id 与挂载点单独管理上游指令变化即整层重建
对体积影响不占镜像体积缓存会被装进层里
CI 复用需要 cache-to/cache-from 或固定构建器跟随构建器状态
与 no-cache-dir二者互斥,选一个不涉及
用了缓存挂载就不要再写 --no-cache-dir 或 npm cache clean,两者互相抵消,等于挂了一个永远空的目录。
target 必须指向工具实际使用的缓存目录,写错时不会报错,只是命中率为零、构建照旧全量下载。
同一个 target 上如果不加 id,不同项目会共用同一份缓存目录,包来源冲突时容易被旧数据带偏;给缓存加 id 能隔离开。

易错点

  • 缓存目录写错(如把 pip 的 /root/.cache/pip 写成 /tmp/pip)不会有任何提示,只是完全没加速
  • 缓存内容不参与镜像内容校验,依赖版本更新后可能命中旧包,必要时换 id 或清理缓存再重建
  • CI 每次跑在全新构建器上时缓存默认留不下来,要配 cache-to、cache-from 才谈得上跨次复用
  • 把缓存挂到之后会被 COPY 覆盖的目录上,缓存与构建上下文互相干扰,构建结果变得不稳定
  • 在 ARM 与 x86 构建器之间共用同一份缓存目录时可能拿到不匹配架构的产物,多平台构建尽量按平台区分 id

数据来源与参考

  • Docker 官方文档:Build cache mounts(docs.docker.com/build/cache/optimize)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌