容器里改了什么
docker diff 列出容器相对其镜像的文件系统变化,用新增、修改、删除三类标记表示。它回答的是「容器里到底改了什么」:既用于排查有人手工改过文件造成的行为异常,也用于判断哪些改动值得固化进镜像。需要注意它只比较容器可写层与镜像,不包含挂载卷里的内容。
基本信息
| 标记含义 | A 为新增,C 为修改,D 为删除 |
|---|---|
| 排查场景 | 服务行为异常,怀疑有人在容器里手工改过文件 |
| 运维场景 | 判断哪些改动应写回镜像与编排 |
| 不覆盖范围 | 只显示相对镜像的改动,不含挂载卷内容 |
| 局限 | 容器重建后可写层消失,这些改动不会保留 |
| 配合用法 | 与 grep 组合只看关心的路径或只看某一类标记 |
典型使用场景
- 排查「代码没改但行为不同」,确认是否有人改过容器内文件
- 纠偏流程:把容器里的手工修补写回镜像,避免下次重建后失效
- 安全排查:确认容器内是否被写入异常文件或脚本
- 构建优化:找出运行期才产生变化的目录,判断是否需要持久化
- 重建前核对改动清单,确认重建不会丢掉必要内容
使用示例
使用示例
docker diff myapp
docker diff myapp | grep -E '^A|^C' | head -n 30 # 只看新增与修改
docker diff myapp | grep -E '^D' # 只看被删除的文件
docker diff myapp | wc -l # 改动规模
docker inspect -f '{{json .Mounts}}' myapp # 排除挂载卷内容的干扰标记与处理建议
| 标记 | 含义 | 处理建议 |
|---|---|---|
| A | 新增文件 | 区分运行时正常产物与手工改动,前者可不处理 |
| C | 修改文件 | 重点关注配置与代码文件,通常是手工修补的痕迹 |
| D | 删除文件 | 可能是有意清理,也可能是误删,需与业务确认 |
| 大量记录 | 配置漂移信号 | 把变动固化进镜像与编排,停止手工修补 |
频繁出现大量新增与修改记录,说明有人习惯在容器里做事后修补:这是配置漂移的信号。处理方式是把变动固化进镜像与编排,让重建后的容器与线上保持一致。
容器的可写层改动不会持久化:容器一旦重建,这些改动全部消失。如果线上已经依赖了它们,重建就会直接变成故障,因此重建前应先用 diff 核对改动清单。