dive:给 Docker 镜像做一次逐层解剖

dive 在 GitHub 上已经拿到 53.9K Star 了。

这个 Go 写的命令行工具只做一件事:把 Docker 镜像一层层拆开,让你看清楚每一层里塞了什么,浪费了多少空间。

1、 这玩意儿是干嘛的

让 Docker 镜像的每一层变成可浏览的目录树。

Docker 镜像的本质是分层叠加。Dockerfile 里每条 RUN 指令生成一层。装依赖是一层,删临时文件又是一层。表面上文件被删了,实际前面那层的数据还留在镜像里,只是被后面那层盖掉了。

结果就是你写了一个自认为 50M 的小镜像,拉下来发现快 1G。多出来的 950M 全是历史残留。

dive 做的事就是把这些残留找出来。它逐层拆解镜像,标记每一层里新增的文件、修改的文件、删除的文件,算出一个效率分,告诉你浪费了多少字节。用终端里的交互界面操作,上下左右就能浏览所有层级和文件。

正文顶部截图

2、 怎么看浪费在哪

dive 提供两种视角。

第一种是聚合视图。选中某一层,右边文件树展示从第一层到这一层累积的全部文件。新增、修改、删除,每种用不同颜色标出来。按 Ctrl+A 就能看到镜像从开始到当前层的全部累积变化。

第二种是单层差异。只看当前层相对于上一层的改动,按 Ctrl+L 切换到这个模式。适合定位到具体是哪一层引入了不该有的文件,或者哪一层覆盖了一个大文件。

它对浪费的定义很直接:同一文件在不同层之间被复制,算浪费;文件在这一层写入、下一层被覆盖,算浪费;文件被删了但前面层还残留,也算浪费。三项汇总后给一个效率百分比,同时给出浪费字节的具体数字。左下角能看到每层的体积和累计大小,效率低于某个比例会醒目提示。

3、 怎么用

一行命令:

dive <镜像名>

比如 dive nginx:latest,回车后打开终端交互界面。左边是层列表,列出每条指令生成的一层,右边是该层的文件树。方向键上下移动,Tab 在左右面板之间切换,空格可以折叠展开目录。

不需要手动拉镜像,dive 自己去取。支持 Docker 引擎、Podman 引擎、本地 tar 归档三种来源,用 --source 参数切换。也能直接 dive build -t some-tag . 替代 docker build,编完立刻看结果,不用切工具。

用 Docker 版的更省事,设个 alias:

alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive"

安装途径覆盖了主流平台:Ubuntu 用 apt 或 snap,CentOS 用 rpm,Mac 用 brew,Windows 用 choco 或 scoop,Arch 用 pacman,也有 Go install 和 Nix 方式。

4、 放进 CI 流水线

CI 模式设置一个环境变量:

CI=true dive <镜像名>

此时 dive 跳过交互界面,分析镜像后根据规则文件 .dive-ci 里的阈值判断通过还是失败,返回对应的退出码。

规则文件配置三条:最低效率比例、最大浪费空间、用户层浪费比例上限。任一条不达标,CI 就标失败。适合放在镜像构建流水线里做质量卡点,每次 build 完自动跑一遍。

README区域截图

5、 适合谁用

每天跟 Docker 镜像打交道、被镜像体积困扰的开发者。维护 CI 流水线、想把镜像瘦身检查自动化的 DevOps。对容器镜像体积有明确约束、需要定期审计镜像结构的团队。

积困扰的开发者。维护 CI 流水线、想把镜像瘦身检查自动化的 DevOps。对容器镜像体积有明确约束、需要定期审计镜像结构的团队。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐