# 依赖层和源码层分开
COPY package.json package-lock.json /app/
RUN npm ci --omit=dev
COPY . /app
docker build -t app:1.0 .

改动一行代码重新构建,日志里 `COPY . .` 后面的每一层都在重新执行,一个 CACHED 都看不到,同一份代码换台机器又能命中原有缓存。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:依赖清单和源码写在同一个 COPY 层里,任何一次改动都会让这层的校验和变化,后面所有层跟着失效,重建的时间全花在重复装包上,缓存等于没有。

「Docker 分层缓存失效」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:把依赖清单单独 COPY 成一个层 先装完依赖再去拷业务源码;两条 COPY 中间不要夹会被频繁改动的业务文件 不然前面白缓存;确认依赖文件变更频率远低于源码 这层缓存才真的划算。

确认没问题再收工,改一个业务文件重建,日志里依赖安装那一层显示 CACHED 才算成功。

作者 9823189