docker diff仅提供一次性快照式差异报告,输出a/c/d标识的文件路径变更,不包含时间戳或操作细节;可结合定时脚本比对前后结果实现准实时监控,但无法捕获瞬时文件或底层overlay改动。
docker diff 本身不支持实时追踪,它只提供容器运行期间相对于镜像的**一次性快照式差异报告**,但可以结合脚本和定时机制模拟“准实时”监控效果。
理解 docker diff 的作用范围
docker diff 输出的是容器启动后,文件系统中新增(A)、修改(C)或删除(D)的文件/目录路径,仅反映从容器创建到执行命令那一刻的累计变更,不包含时间戳、操作类型(如写入/追加/重命名)或文件内容变化细节。
常见输出示例:
- A /var/log/app.log —— 新建日志文件
- C /etc/nginx —— 目录被修改(可能新增或删改内部文件)
- D /tmp/cache —— 整个目录被删除
构建简易轮询监控脚本
通过定期执行 docker diff 并比对前后结果,可识别出新增变动。关键在于保存上一次的 diff 结果并做差集:
- 用
docker diff <container> | sort</container>获取有序列表,避免顺序干扰 - 将结果写入临时文件(如
/tmp/diff-$(date +%s)),保留最近两次记录 - 用
comm -13 提取本次新增条目 - 配合
watch -n 2或 systemd timer 实现每2秒检查一次
注意局限与替代方案
该方法无法捕获瞬时文件(如秒级创建又删除的日志)、硬链接变更或 overlay2 层内未暴露到容器挂载点的底层改动。
若需真正实时、细粒度(如谁在何时修改了哪个文件),应考虑:
- 容器内部署 inotify-tools + 日志转发(适合可控镜像)
- 宿主机上用 inotifywait 监控容器对应的 overlay 工作目录(路径形如
/var/lib/docker/overlay2/<id>/merged</id>,需 root 权限且依赖存储驱动) - 使用 eBPF 工具(如 bpftrace)跟踪 syscalls,精度高但学习成本大
快速验证变动是否发生
日常调试中,不必写脚本也可高效利用 docker diff:
- 在关键操作前执行
docker diff <container> > before.txt</container> - 触发目标行为(如重启服务、上传配置、运行脚本)
- 立即再执行
docker diff <container> > after.txt</container>,用diff before.txt after.txt查看净变化 - 重点关注
A类路径——常对应新生成日志、缓存、PID 文件等











