菜单

架构

相关源文件

本文档提供了 Dive 架构的高级概述,解释了主要组件及其交互。有关镜像分析过程的详细信息,请参阅镜像分析过程。有关为 Dive 核心功能提供支持的文件系统实现的信息,请参阅文件系统

概述

Dive 遵循分层架构,该架构围绕分析 Docker/OCI 容器镜像的主要目标而设计,重点关注层探索和大小优化。该工具采用解析器模式来支持多种镜像源、全面的分析引擎以及双输出模式(交互式 TUI 和 CI 集成)。

来源:go.mod README.md8-9 dive/get_image_resolver.go

核心架构组件

Dive 的架构包含四个主要组件

  1. 镜像解析系统 - 从不同来源获取镜像
  2. 分析引擎 - 处理镜像数据以提取层并构建文件系统
  3. UI 系统 - 在交互式终端界面中呈现分析结果
  4. CI 集成 - 为 CI/CD 流水线提供自动化验证

这些组件协同工作,实现了镜像的交互式探索和自动化分析。

来源: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

分析引擎

分析引擎负责处理容器镜像,以提取有关其结构、内容和效率的有用信息。它包含几个关键组件

  1. 层提取 - 从容器镜像中提取层数据
  2. 文件系统构建 - 构建表示每个层文件系统的文件系统
  3. 层比较 - 识别层之间的差异
  4. 效率计算 - 分析浪费的空间并计算效率得分

来源:README.md52-65

文件树系统

文件系统系统是表示容器镜像文件系统结构的核心组件。它为分析层之间的差异和识别浪费的空间提供了基础。主要组件包括

  • FileNode - 表示文件系统中的文件或目录
  • FileTree - 包含层中 FileNodes 的完整层次结构
  • Comparer - 识别层之间文件系统的差异

有关文件系统系统的更多详细信息,请参阅文件系统

用户界面

Dive 提供两种主要的内置用户界面

  1. 终端 UI (TUI) - 用于探索镜像层和内容的交互式界面
  2. CI 模式 - 用于 CI/CD 流水线中自动化验证的非交互式模式

终端用户界面

终端 UI 提供了一种探索容器镜像的交互方式。它由几个面板组成

  1. 层视图 - 显示镜像层及其元数据
  2. 文件系统视图 - 显示每个层的文件系统以及更改指示
  3. 效率面板 - 显示效率指标和浪费空间统计信息

有关 UI 组件的更多详细信息,请参阅用户界面

CI 集成

CI 模式允许将 Dive 集成到 CI/CD 流水线中,以强制执行镜像效率标准。当以 CI=true 运行并指定配置参数时,Dive 将绕过 UI,而是根据可配置的阈值评估镜像

来源:README.md236-252

数据流

下图说明了数据流经 Dive 系统,从镜像解析到结果展示

来源:dive/get_image_resolver.go README.md13-46

结论

Dive 的架构旨在提供在镜像来源方面的灵活性和全面的分析能力。镜像解析、分析和展示层之间的清晰分离使得该工具能够支持多种容器引擎和不同的操作模式。

解析器模式允许将来轻松扩展以支持其他镜像来源,而模块化的分析引擎可以在不影响系统其余部分的情况下增强新功能。