如何强制 Docker 不用缓存、完全重新构建镜像?
docker build --no-cache 跳过全部层缓存从零构建;只想让某一步之后的缓存失效,可用 --build-arg 注入变化值或 docker compose build --no-cache。本文给出各场景做法。
做法:docker build --no-cache -t 镜像名 .——加 --no-cache 参数后构建器不复用所选阶段的指令缓存,仍受阶段选择和缓存挂载等机制影响。配合 --pull 还能检查并尝试拉取所引用基础镜像的更新,但不保证内容可复现。
完整命令
docker build --no-cache --pull -t myapp:1.2 .
--no-cache:不复用构建指令缓存,不等于清空RUN --mount=type=cache的数据--pull:检查所引用基础镜像是否有更新;digest固定引用仍指向相同内容
docker-compose 场景:
docker compose build --no-cache
docker compose up -d --no-build
什么时候需要干净构建
- 怀疑缓存导致旧内容:比如
apt-get update && install被缓存命中,装的包版本过时 - 发布前最终验证:检查不依赖指令缓存也能构建;可复现还需固定镜像digest、依赖及外部输入,CI 上尤其重要
- 排查"本地能跑、线上不行":本地缓存掩盖了 Dockerfile 的缺陷
只想让某一层之后失效
不必全量重建,让缓存"定点失效"更省时间:
ARG CACHEBUST=1
RUN git clone https://github.com/org/repo.git
docker build --build-arg CACHEBUST=$(date +%s) -t myapp .
ARG值变化通常在首次使用它的指令处造成缓存失效(RUN环境也会使用已声明ARG),不是ARG声明行本身立即使所有后续无条件失效,前面的层继续吃缓存。
顺手清理构建缓存
缓存攒多了占磁盘:
docker builder prune # 清悬空构建缓存
docker builder prune -a # 清全部未使用构建缓存
常见问题(FAQ)
Q:--no-cache 构建很慢,正常吗?
A:正常,相关阶段的缓存失效会增加执行工作。日常开发用缓存,定期或发布前做 no-cache 验证即可。
Q:BuildKit 下有什么不同?
A:BuildKit(现在默认启用)缓存粒度更细,--no-cache 语义相同;还可用 --no-cache-filter 阶段名 只禁用指定阶段的缓存。
Q:为什么加了 --no-cache 镜像内容还是旧的?
A:多半是基础镜像旧——FROM 指向的本地镜像没更新,补 --pull;或上下文里有 .dockerignore 没排除的旧文件被 COPY 进去。