docker diff 是什么
diff 用来对比容器可写层与它所基于的镜像,列出运行期间被新增、修改与删除的文件路径。它给出的是一份「变了哪些文件」的清单,不含内容差异,因此常作为排查起点:先确定范围,再用 exec 或 logs 深入。注意它只看可写层,挂载卷里的变化不属于比较范围。
基本信息
| 语法 | docker diff 容器 |
|---|---|
| 三个标记 | A 表示新增、C 表示内容或属性变化、D 表示删除 |
| 比较范围 | 容器可写层与镜像原始内容之间 |
| 不包含 | 挂载卷(-v/--mount)里的任何变化 |
| 相关命令 | docker commit 固化改动、docker export 导出文件系统 |
| 适用平台 | 所有支持 Docker 的 Linux 与 Windows 容器环境 |
典型使用场景
- 排查配置被谁改动:定位应用启动后修改的文件
- 确认容器是否有隐式写盘行为,评估是否该改挂载卷
- 分析异常容器:对比正常与异常实例的文件差异
- 提交快照前检查夹带了哪些临时文件
- 迁移或导出前确认真正需要保留的路径
使用与缩小范围
使用与缩小范围
# 全量输出:A 新增、C 修改、D 删除
docker diff web
# 只看新增文件(应用启动时写入的内容通常是新增)
docker diff web | grep '^A' | head -50
# 排除高频噪音目录,聚焦可疑路径
docker diff web | grep -v -E '^C /var/log|^C /tmp' | head -50
# 与 logs 结合:先定位改动时间点,再判断是否与报错同时发生
docker logs --tail 100 web输出逐列读法
| 标记 | 含义 | 常见文件与判断 |
|---|---|---|
| A | 新增 | 缓存、运行期生成的数据、日志文件 |
| C | 内容或元数据变化 | 配置文件、数据库文件、权限变更 |
| D | 删除 | 临时文件清理、被应用移除的旧配置 |
| 无前缀路径 | 未被改动 | 可忽略 |
| 大量 /var/log 变化 | 日志写进可写层 | 建议改为挂载卷或输出到标准输出 |
diff 只给路径不给内容,想知道具体改了什么,需要配合 docker exec 查看文件,或与镜像原始内容做进一步比对。
长时间运行的容器 diff 输出可能成千上万行,先按目录或标记过滤再阅读;把结果导出到文件再检索通常比在终端里翻页高效。