container-diff可精准快速对比两个Docker镜像的文件系统差异,自动解析层内容并分类显示新增、修改、删除文件,结合docker history和dive能进一步定位变更指令与空间占用。

直接用 container-diff 就能清晰对比两个镜像的文件系统差异,比手动导出解压再 diff 更准、更快、更贴近实际运行状态。
用 container-diff 快速查文件增删改
它专为镜像设计,不用拉取完整文件系统,自动解析层内容并归类变化:
-
新增文件:比如
v2.1比v2.0多了/app/config.yaml -
修改文件:同一路径内容不同(如
/app/version.txt内容从2.0改为2.1) -
删除文件:
v2.1中已不存在但v2.0里有的路径,例如旧日志模板/etc/logrotate.d/old.conf
执行命令:
container-diff diff docker://myapp:v2.0 docker://myapp:v2.1 --type=file
输出会按类别分组,带行数统计,一眼看出哪些是有效变更、哪些可能是误操作残留。
结合 docker history 看“谁动了哪一层”
光知道文件变了还不够,得定位到 Dockerfile 的哪条指令导致的。这时配合 docker history:
- 分别运行
docker history myapp:v2.0和docker history myapp:v2.1 - 重点比对顶层几层的
Size和CreatedBy—— 大小突增或指令明显不同(如COPY . /appvsCOPY dist/ /app)就是关键线索 - 若某层显示
0B但实际删了大文件,说明用了RUN rm -f这类“虚删”,需警惕空间未释放
进阶:用 dive 查看层内真实文件占用
container-diff 告诉你“哪里变了”,dive 告诉你“变了多少、具体在哪”:
- 运行
dive myapp:v2.1,左侧列出每层真实大小(含隐式占用) - 点开某层,右侧显示文件树:绿色 是本层新增(重点关注大文件),橙色 是上层有、本层改过(可能被复制,占双份空间)
- 切换到
Ctrl+L模式,只看“仅本层存在”的文件,快速识别冗余内容
验证是否真有差异:先确认镜像不是同一份
有时看似两个标签(如 myapp:latest 和 myapp:v2.1),其实指向同一个镜像 ID:
- 运行
docker images --digests | grep myapp - 对比
DIGEST列 —— 只有 Digest 不同,才说明内容确实有差异;Digest 相同就不用比了 - 注意:不同 Registry(如 Docker Hub 和阿里云)上的同名镜像,Digest 可能不一致,此时应以层
digest(来自docker inspect的RootFS.Layers)为准


















