本文档提供了 Dive 架构的高级概述,解释了主要组件及其交互。有关镜像分析过程的详细信息,请参阅镜像分析过程。有关为 Dive 核心功能提供支持的文件系统实现的信息,请参阅文件系统。
Dive 遵循分层架构,该架构围绕分析 Docker/OCI 容器镜像的主要目标而设计,重点关注层探索和大小优化。该工具采用解析器模式来支持多种镜像源、全面的分析引擎以及双输出模式(交互式 TUI 和 CI 集成)。
来源:go.mod README.md8-9 dive/get_image_resolver.go
Dive 的架构包含四个主要组件
这些组件协同工作,实现了镜像的交互式探索和自动化分析。
来源:dive/get_image_resolver.go18-71 dive/image/docker/archive_resolver.go
镜像解析系统负责从不同来源获取容器镜像。Dive 采用解析器模式,该模式通过通用接口隐藏了每个镜像源的具体细节。
Dive 支持三种主要的镜像来源,在代码库中定义为常量
| 源类型 | 描述 | 解析器实现 |
|---|---|---|
SourceDockerEngine | 来自本地 Docker 守护进程的镜像 | docker.NewResolverFromEngine() |
SourcePodmanEngine | 来自本地 Podman 守护进程的镜像 | podman.NewResolverFromEngine() |
SourceDockerArchive | 来自 Docker tar 归档文件的镜像 | docker.NewResolverFromArchive() |
每种来源类型都有相应的解析器实现,负责处理从该特定来源获取镜像的细节。
解析器模式使 Dive 能够通过统一的接口处理不同的镜像来源。该模式的核心是 image.Resolver 接口
来源:dive/get_image_resolver.go13-73 dive/image/docker/archive_resolver.go11-42
解析器的选择由 GetImageResolver 函数处理,该函数根据提供的镜像源返回适当的解析器
这种抽象使得应用程序的其余部分可以处理各种来源的镜像,从而提供了灵活性和可扩展性。
来源:dive/get_image_resolver.go62-73
分析引擎负责处理容器镜像,以提取有关其结构、内容和效率的有用信息。它包含几个关键组件
文件系统系统是表示容器镜像文件系统结构的核心组件。它为分析层之间的差异和识别浪费的空间提供了基础。主要组件包括
有关文件系统系统的更多详细信息,请参阅文件系统。
Dive 提供两种主要的内置用户界面
终端 UI 提供了一种探索容器镜像的交互方式。它由几个面板组成
有关 UI 组件的更多详细信息,请参阅用户界面。
CI 模式允许将 Dive 集成到 CI/CD 流水线中,以强制执行镜像效率标准。当以 CI=true 运行并指定配置参数时,Dive 将绕过 UI,而是根据可配置的阈值评估镜像
下图说明了数据流经 Dive 系统,从镜像解析到结果展示
来源:dive/get_image_resolver.go README.md13-46
Dive 的架构旨在提供在镜像来源方面的灵活性和全面的分析能力。镜像解析、分析和展示层之间的清晰分离使得该工具能够支持多种容器引擎和不同的操作模式。
解析器模式允许将来轻松扩展以支持其他镜像来源,而模块化的分析引擎可以在不影响系统其余部分的情况下增强新功能。