docker构建缓存通过复用未变的中间层镜像加速构建,核心是按稳定性排序指令:基础镜像和系统依赖靠前,应用依赖与源码分离,精准copy配合.dockerignore,合并run指令并清理缓存,启用buildkit及--cache-from等特性提升缓存效率。

Docker 构建缓存是加速镜像构建最直接、最有效的机制,关键在于让 Docker 复用已有的中间层镜像,避免重复执行耗时指令(如安装依赖、编译代码)。核心原则是:把变动少的指令尽量放在前面,变动频繁的指令靠后,并合理组织 RUN、COPY 和 ADD 的顺序与粒度。
利用分层缓存,按稳定性排序指令
Docker 按照 Dockerfile 中指令的顺序逐层构建,每条指令对应一个镜像层。只要某一层的指令及其上下文(包括上一层的文件内容、环境变量等)未变,Docker 就会复用该层及之后所有可复用的层。
- 基础镜像(
FROM)和系统级依赖(如apt-get update && apt-get install)应尽早出现,它们很少变更 - 应用依赖(如
pip install -r requirements.txt或npm install)要与源码分离:先单独复制依赖清单(requirements.txt、package.json),再运行安装命令;这样只有清单变化时才重装依赖,而非每次改一行代码都重装 - 源码复制(
COPY . /app)应放在依赖安装之后——否则只要任意源文件改动,就会使缓存在COPY处失效,导致后续所有层重建
合并 RUN 指令,减少层数并提升缓存命中率
每个 RUN 指令都会创建新层。过多独立的 RUN 不仅增加镜像体积,还容易因其中某步变动(如时间戳、临时文件)导致后续缓存全部失效。
- 将关联操作合并为单个
RUN,例如:RUN apt-get update && apt-get install -y curl jq && rm -rf /var/lib/apt/lists/* - 安装后立即清理缓存(如
rm -rf /var/lib/apt/lists/*或apk --no-cache add),避免无用数据进入镜像层 - 避免在
RUN中使用可能引入不确定性的命令(如date、curl https://api.example/time),它们会让缓存失效
精准 COPY,避免无意中破坏缓存
COPY 指令的缓存基于文件内容哈希。哪怕只改了一个空格或时间戳,也会导致该层及之后所有层重建。
- 用
.dockerignore排除日志、本地配置、IDE 文件(.git、__pycache__、node_modules等),防止无关文件触发缓存失效 - 优先按功能拆分复制:先
COPY requirements.txt .→RUN pip install,再COPY . .;而不是一股脑COPY . .后再安装 - 对多阶段构建中的构建阶段,可使用
COPY --from=builder精确提取产物,跳过整个构建过程,进一步规避运行时缓存干扰
启用构建器特性,增强缓存控制能力
Docker BuildKit(Docker 18.09+ 默认启用)提供了更智能的缓存策略和调试支持。
- 启用 BuildKit:
DOCKER_BUILDKIT=1 docker build ...或设置export DOCKER_BUILDKIT=1 - 使用
--cache-from复用远程镜像仓库中的构建缓存(需配合--cache-to推送) - 利用
RUN --mount=type=cache为包管理器(如 pip、npm、cargo)提供跨构建的持久化缓存目录,显著加快重复安装速度 - 通过
docker buildx build --progress=plain查看详细缓存命中/未命中原因,定位瓶颈










