不同父层的相同Docker镜像层是否会重复存储与推送?
Docker overlay2存储驱动下的镜像层复用与推送问题
本地存储层面:顶层B的内容是否重复存储?
不会重复存储。Docker的镜像层是**基于内容哈希(SHA256)**识别的,不管顶层B依赖的底层是A还是AA,只要B层的内容完全一致,它的哈希值就相同。overlay2存储驱动会直接复用已存在的B层文件,不会在本地磁盘生成重复副本。
构建时如何复用内容?
你提到的缓存失效是指构建指令上下文或基础镜像变化时,后续层会重新执行构建,但这和层内容复用是两码事:
- 只要构建顶层B的Dockerfile指令和之前完全一致,且构建上下文里的文件没有变化,即使底层换成了AA,Docker在构建完AA层后,会检查本地是否存在内容哈希匹配的B层,若存在则直接复用该层,无需重新生成内容,只是把新镜像的层指针指向已有的B层。
- 若构建B层的指令或上下文有变化,但最终生成的内容和原B层完全一致,依然会复用已有的层文件。
镜像推送时:顶层B会被推送两次吗?
不会。远程镜像仓库同样通过层的哈希值识别内容:
- 推送第一个包含B层的镜像时,仓库会存储B层;
- 推送第二个依赖AA+B的镜像时,仓库检测到B层的哈希已存在,只会推送AA层,跳过B层的上传。
内容的提问来源于stack exchange,提问作者wujek
相关产品推荐
相关产品推荐

