缓存挂载是什么
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 能隔离开。