← 中文资源

简体中文版本

Docker 每次构建都使缓存失效

通过调整 Dockerfile 层顺序并避免破坏早期层的改动,修复反复的缓存失效。

阅读英文原文

症状

每次构建都耗时相同,因为缓存从未被复用,输出显示步骤重新执行而非命中缓存。这是层顺序问题:频繁变动的文件在昂贵的依赖安装之前被复制,于是每次源码改动都使安装层及其后所有层失效。构建参数与变化的标签也可能意外破坏缓存。

诊断

用 –progress=plain 查看哪一步未命中缓存;调整为先复制清单再安装;检查两次构建间变化的文件。

docker build --progress=plain . 2>&1 | grep -i "CACHED\|CACHE"

根因

某个频繁变化的层排在昂贵层之前,其输入的任何改动都会使缓存的依赖安装失效并强制完整重建。

修复

按从最少变到最多变的顺序排列层;先复制依赖清单并安装,再复制源码;用 .dockerignore 把易变文件挡在早期层之外;保持构建参数稳定。

验证

修改一个源文件后重新构建,确认依赖层报告 CACHED 而非重跑。微小改动下缓存复用即证明顺序正确。

常见陷阱

为省事用 COPY . . 放在最前会让任何文件改动都重建全部层;应拆分复制步骤。