如何查看 Docker 镜像里包含什么内容?
查看镜像内容四种方法:起容器 exec 进去看、docker create+export 导出文件系统不启动容器、docker history 看分层构建历史、用 dive 工具逐层可视化。本文给出命令与场景选择。
四种方法按场景选:①起个容器 docker run -it --rm --entrypoint sh 镜像 直接看;②不想启动:docker create 创建容器后 docker export 导出 tar 解包看;③看构建历史与每层大小:docker history 镜像;④逐层精细分析用 dive 工具。
方法一:起容器直接看(最直观)
docker run -it --rm --entrypoint sh myimage # 有 shell 的可信镜像
ls -l /
cat /etc/os-release
--rm 退出即自动删容器,不留垃圾。
方法二:不启动容器,导出文件系统
docker create --name tmp myimage inspection-placeholder # 只创建,不执行占位命令
docker export tmp -o fs.tar
docker rm -v tmp # 同时清理本次检查产生的匿名卷
mkdir fs && tar -xf fs.tar -C fs # 解包随便翻
适合镜像入口命令会卡住/报错的场景,也适合 distroless(无 shell)镜像。create/export 不执行镜像入口程序;export 不包含挂载卷内容,挂载覆盖的路径导出的是底层容器目录。解包未知镜像时应使用隔离目录,避免以 root 操作不可信归档。
方法三:看分层历史
docker history myimage
docker history --no-trunc myimage # 看完整命令
history 展示镜像保存的构建历史与大小,不保证恢复完整 Dockerfile,也不列出每层文件。排查体积可先看这里;已删除的文件可能仍留在早期镜像层,需要 save/dive 检查,不能仅靠 history 证明不存在敏感内容。
方法四:dive 逐层分析(镜像减肥神器)
dive myimage
交互式展示每层新增/修改的文件,精准定位体积元凶。
只想看配置不看文件
docker inspect myimage # 环境变量、入口命令、暴露端口等元数据
常见问题(FAQ)
Q:export 和 save 看到的有什么不同?
A:export 导出容器文件系统视图,不含挂载卷内容和完整镜像元数据;docker save 保留镜像层与元数据。归档布局依格式而异,检查分层变化还需理解删除标记(whiteout),不能简单逐层覆盖解包。
Q:镜像里没有 sh,方法一报错?
A:distroless/scratch 类镜像,用方法二导出看,或 docker run --entrypoint 指定镜像里已有的可执行文件。
Q:想看某一层具体加了什么文件?
A:docker save 解包后逐层看 tar;或 dive 工具直接展示。