使用 diving 精简 docker 镜像

238 天前
 treexie

在 docker 支持多阶段构建(multi-stage builds)之后,构建运行时的镜像仅将在最后阶段复制依赖的文件即可,对于golangrust等仅需要复制运行文件即可,基于alpine为基础镜像构建,或者可直接使用slim精简化镜像,使用方式简单快捷。

那么在生成镜像之后,如果想了解镜像的具体内容,细化分析优化镜像,那么可以尝试使用 diving ,它可展示 docker 镜像的每一层文件列表,它支持两种模式:命令行(默认模式)以及 web 模式,使用 rust 语言开发编译出的可执行文件,无需依赖任何东西,包括 docker 客户端。

镜像 Layer 汇总

docker 镜像由一层层的 layer 构成,第一层为基础镜像,而后面的镜像为构建脚本时生成的,在针对 layer 分析时需要一层层的来优化考虑。

基础镜像为运行镜像的最底层,建议考虑选择alpine或各发行版的slim等精简的镜像,也仅安装运行时所依赖的模块,减少引入各种漏洞的风险。

首先可以先看镜像汇总,其包括 4 项指标:

由上面的 4 点指标可快速得出 Layer 的分析结论,明确第一层基础镜像是否过大(如果是可选择基于 alpine ),其它层级总大小是否符合预期(如果比项目预期过大则按层分析所添加数据),浪费的空间大小是否可避免(对于后续层级重复更新、删除等文件是否无效操作),后续创建的层级是否需要每次创建等。

镜像 Layer 层级分析

若感觉某个 layer 数据不合理时,如何针对其做具体分析呢?docker hub提供了构建镜像每个 layer 对应的命令,简单的分析可直接查看命令是否合理。而 layer 包括了哪些文件,以及具体相关文件的具体信息则需要具体解析 layer 的目录树才可获取,docker运行时则是将所有 layer 解析后层级重叠汇总完整目录树。

如上所示,镜像分层数据可按层级选择、按文件大小过滤、按是否更新或删除过滤(每层的文件均为新增,因此无需提供是否新增过滤)、文件名称搜索等功能,通过以上的筛选配置,则可快速分析该层数据是否有优化空间。常用的方法如下:

小结

diving 提供快速便捷的镜像分析方式,可以定期针对项目镜像汇总生成分析报告,优化镜像构建逻辑,精简避免无效镜像数据。diving 提供了 terminal 与以 web 形式,web 的测试地址可以直接使用以下地址:https://diving.npmtrend.com/

782 次点击
所在节点    Docker
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/974636

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX