查看镜像分层
docker history 展示镜像每一层的创建命令与占用大小,是回答「镜像为什么这么大」和「敏感文件有没有残留在历史层」的第一手证据。默认输出会截断创建命令,加 --no-trunc 才能看到完整内容;配合 --format 可以只取关心的字段,便于脚本筛选与留档。
基本信息
| 输出字段 | IMAGE、CREATED BY、SIZE、COMMENT |
|---|---|
| 用途一 | 定位体积大头:哪条 RUN 或 COPY 产生了大层 |
| 用途二 | 审计历史层中是否残留凭据、证书或临时文件 |
| 关键语义 | 历史层中删除的文件仍占空间,除非删除与创建在同一层 |
| 常用选项 | --no-trunc 显示完整命令;--format 自定义输出 |
| 配合命令 | docker image inspect 查看总大小与层信息 |
典型使用场景
- 镜像体积优化:找出究竟是哪一层贡献了主要占用
- 安全审计:确认构建过程中是否把密钥或配置文件写进了层
- 排查缓存失效:确认哪一层发生变化导致后续层全部重建
- 交付前检查构建过程是否符合规范(基础镜像、依赖来源、清理动作)
- 版本对比:看两个版本的层差异,判断变更范围是否符合预期
使用示例
使用示例
docker history myapp:1.0.0
docker history --no-trunc myapp:1.0.0 | head -n 20 # 看完整创建命令
docker history --format '{{.Size}}\t{{.CreatedBy}}' myapp:1.0.0 | head -n 10
docker image inspect myapp:1.0.0 --format '{{.Size}}' # 镜像总大小(字节)
docker history --no-trunc myapp:1.0.0 | grep -i -E 'secret|token|password|key' # 审计残留输出逐列读法
| 列 | 含义 | 异常表现 |
|---|---|---|
| IMAGE | 层 ID,顶层常显示为 missing | 大量 missing 属正常现象,不影响镜像运行 |
| CREATED BY | 生成该层的命令 | 出现大文件 COPY 或 ADD 即为体积来源 |
| SIZE | 该层的新增占用 | 某层明显远大于其他层时重点检查 |
| CREATED | 创建时间 | 基础层时间陈旧说明基础镜像长期未更新 |
| COMMENT | 构建系统注释,通常为空 | 出现异常注释说明构建流程被改动过 |
镜像瘦身优先看 history 找大层:常见大头是依赖包缓存、临时下载物与未清理的 apt/yum 缓存。要真正减小体积,必须把清理动作与安装动作放在同一条 RUN 里,否则文件仍留在上一层。
镜像历史层可以被还原:即使后续层删除了文件,只要文件在某层写入过,就能从该层提取出来。密钥一旦进入任何一层,应对方式是重建镜像并轮换密钥,补一条删除命令并不能消除泄露。