直接用 docker history 命令就能看到镜像的详细构建历史和每一层的构成,它把镜像“一层层拆开”,告诉你每层是谁建的、怎么建的、占多大空间;基础查看显示 IMAGE ID、CREATED、CREATED BY、SIZE、COMMENT 五列信息,从下往上读,最底层是基础镜像,最顶层是最后指令,支持 --no-trunc 展开截断命令、--filter "size>0" 过滤空层、--format 自定义输出格式。

直接用 docker history 命令就能看到镜像的详细构建历史和每一层的构成,它把镜像“一层层拆开”,告诉你每层是谁建的、怎么建的、占多大空间。
基础查看:看清每层来源和大小
运行命令即可获得默认格式的分层记录:
-
docker history nginx:latest—— 显示五列信息:IMAGE ID、CREATED、CREATED BY、SIZE、COMMENT - 注意顺序:从下往上读,最底层是基础镜像(如
alpine或debian),最顶层是你最后写的指令(比如CMD) - 某些层显示
<missing>,通常表示该层来自外部构建或未缓存,不是本地 Dockerfile 生成的
展开被截断的命令
默认情况下,长命令(例如一整行 RUN apt-get install -y ...)会被缩写成 /bin/sh -c ... 并省略后半部分。加 --no-trunc 就能看见完整指令:
docker history --no-trunc nginx:latest- 这对排查是否误留敏感操作(如硬编码密码、未清理的临时文件)特别有用
过滤掉无实际文件变更的层
像 ENV、LABEL、ARG 这类指令不改动文件系统,但也会生成一个空层(SIZE 为 0)。想聚焦真正影响体积的操作,就过滤掉它们:
-
docker history --filter "size>0" nginx:latest—— 只显示有文件变化的层 -
docker history --filter "size>10MB" nginx:latest—— 快速定位臃肿层,比如没清理的apt cache或调试工具
定制输出,方便分析或脚本处理
用 --format 按需提取字段,支持 Go 模板语法:
-
docker history --format "{{.CreatedBy}}: {{.Size}}" --no-trunc nginx:latest—— 专注看“哪条指令占了多大空间” -
docker history --format "{{.ID}} {{.Size}}" nginx:latest—— 简洁列出层 ID 和大小,适合后续脚本处理 -
docker history --format "{{json .}}" nginx:latest > history.json—— 输出结构化 JSON,便于程序解析


















