问题出现得很突然,日志倒是留得挺全。Ubuntu 22.04 的构建机上 docker build 越来越慢,改一行代码也要四分钟,docker system df 显示 build cache 占了 62G,构建日志里明明大量 CACHED 却还是等很久。

刚开始盯着「多阶段构建的中间阶段没清理,用不到的层也留在缓存里」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。buildkit 按层存缓存,Dockerfile 里 COPY . 放在前面,任何改动都会让后面全部失效。也可能是没有配 builder 的回收策略,缓存只增不减,磁盘寻道越来越慢。

少数情况下是构建上下文包含 node_modules 和 .git,每次都要打包传输。

第一件事是看缓存都花在哪些层

docker system df -v | head -20

再往下清掉构建缓存再对比耗时

docker builder prune -af && time docker build -t app:test .

接着检查 Dockerfile 里 COPY 的顺序

grep -n -E '^(COPY|ADD|RUN)' Dockerfile | head -20

补上忽略文件和定期回收

printf '%s
' 'node_modules' '.git' 'dist' > .dockerignore && docker buildx prune --filter until=168h -f

别只看报错消失,验证要多做一步。同样改一行代码的构建时间从四分钟降到四十秒,docker system df 里 build cache 回落到 10G 以内。

缓存不是越多越好,构建机按周清一次反而更快;COPY 的顺序决定命中率,依赖描述文件一定要单独先拷进去。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189