核心是让COPY指令复用缓存层:先拷贝稳定依赖文件(如package.json)、RUN安装,再拷贝易变源码;配合.dockerignore排除干扰、多阶段构建隔离、BuildKit提升效率,确保小改动不触发整链重跑。
核心思路是让缓存尽可能“稳住”,避免一丁点改动就全盘重来。关键不在删缓存,而在设计让缓存能真正复用。
Docker 缓存按层逐条比对,只要某一层变了,后面全得重跑。源码天天改,但依赖描述文件(如 package.json、requirements.txt)改得少。所以得先复制它们、装依赖,再复制源码。
COPY package.json .<br>RUN npm install<br>COPY . .
COPY . .<br>RUN npm install—— 一行代码改了,npm install 就必须重来
Docker 构建时默认把当前目录整个打包传进构建器,哪怕你只改了一个 .js 文件,只要 node_modules 或 .git 在目录里,它们的哈希值也会参与缓存计算,导致缓存总不命中。
.dockerignore,至少包含:node_modules/<br>.git/<br>.DS_Store<br>*.log<br>dist/<br>build/
docker build --progress=plain .,看日志里 “Sending build context” 的大小——理想应控制在几 MB 内缓存失效常因底层“悄悄变了”:比如 FROM node:latest 实际拉到的是新版 node,哈希值不同,第一层就崩了;pip install flask 不指定版本,下次可能装新 patch 版,第二层也崩。
FROM node:18.17.0-slim 或 FROM python:3.11.9-slim,不用 latest、slim 等浮动标签"express": "4.18.2",不用 ^4.18.0;requests==2.31.0,加 --no-deps 或 --freeze 确保可重现本地缓存只对单机有效;CI 流水线每次都是新机器,必须靠远程缓存接力。BuildKit 是现代构建引擎,支持高效缓存共享。
DOCKER_BUILDKIT=1,或 CLI 加 --builder=buildkit
docker build --cache-to type=registry,ref=my-registry/cache:app --cache-from type=registry,ref=my-registry/cache:app -t myapp:latest .