Docker删除镜像后重新build仍复现旧镜像未从头构建问题
问题根因
你之前执行的删除操作仅移除了***_seis:latest标签对应的镜像引用,并未清理Docker BuildKit的独立构建缓存,这是缓存命中导致的现象。
Docker 18.09及之后版本默认使用BuildKit作为构建引擎,BuildKit维护了一套独立于最终镜像、容器存储的构建缓存池:Dockerfile中每一条RUN、COPY、ADD指令生成的中间层,都会按指令哈希、关联文件哈希作为索引存在这个缓存池里,不会因为最终打标签的镜像被删除就自动清除。
从你的构建日志可以看到,所有非基础镜像拉取的步骤全部标记为CACHED,说明每一步的校验哈希都和3天前首次构建时完全匹配,BuildKit直接复用了旧的缓存层拼接成最终镜像,没有重新执行任何构建命令,因此构建耗时极短,最终生成的镜像层哈希和3天前的版本完全一致,显示的创建时间自然是旧的时间。
你之前尝试的docker rmi、docker image prune、Docker Desktop手动删除镜像操作,作用范围仅为镜像标签、未被引用的悬空镜像,默认不会触碰BuildKit的构建缓存池,因此会出现镜像“删了又立刻出现”的情况。
解决方案
根据你的需求选对应操作即可:
- 单次构建强制从零开始,不影响其他镜像的构建缓存:构建命令添加
--no-cache参数,直接跳过所有缓存校验,全量重新执行构建步骤:
docker build --no-cache -f dockerfile -t ***_seis:latest .
- 清理本地所有BuildKit构建缓存(执行后所有镜像的下次构建都会从头执行,适合需要彻底清空构建缓存的场景):
docker builder prune -a
执行命令后会弹出确认提示,输入y回车即可完成缓存清理,之后再执行常规构建命令就会全量跑流程,构建耗时、镜像创建时间都会和实际执行情况一致。
注:
docker ps -a检查容器、删除关联容器的操作对解决这个问题没有影响,因为构建缓存和运行态/停止态容器没有绑定关系。
内容的提问来源于stack exchange,提问作者selfPointer
相关产品推荐
相关产品推荐

