菜单

层视图

相关源文件

图层视图是 Dive 用户界面的核心组件,它以结构化、交互式的方式显示 Docker/OCI 镜像的图层。它允许用户浏览、选择和分析容器镜像的每个图层,提供有关镜像构建方式的见解,并帮助识别优化机会。

有关显示图层内容的辅助文件树视图的信息,请参阅 文件树视图

图层视图概述

图层视图出现在 Dive 终端用户界面的左侧,并按从下到上的顺序显示容器镜像的每个图层,这与 Dockerfile 中图层的构建方式(从基础层到最终层)相对应。

来源: README.md55-57

数据结构

图层视图可视化了 Layer 结构,该结构代表了一个 Docker 镜像图层,包含其元数据和关联的文件树。

来源: dive/image/layer.go16-24

图层视图中的每层显示两个主要信息

  • 图层大小:图层的可读大小(例如,“1.2MB”)
  • 图层命令:创建该图层的 Dockerfile 指令(例如,“FROM ubuntu:20.04”或“RUN apt-get update”)

例如,一个图层可能显示为

  1.2MB  FROM ubuntu:20.04

来源: dive/image/layer.go43-52

UI 表示

图层视图以格式化字符串形式呈现每层的大小和命令。图层的完整 ID 通常会使用 ShortId() 方法缩短为前 15 个字符以供显示。

元素描述示例
大小可读的图层大小1.2MB
命令Dockerfile 指令RUN apt-get update
选择高亮的活动图层► 4.5MB RUN npm install

第一个图层(索引 0)通常显示为“FROM”指令,显示基础镜像,而后续图层则显示其各自的命令。对于多行命令(如 heredocs),换行符会被替换为一个特殊字符 (↵),以确保图层在单行上显示。

来源: dive/image/layer.go37-52 dive/image/docker/layer.go17-30

图层数据来源

图层数据通过不同容器引擎(Docker、Podman 等)的适配器从容器镜像中提取。例如,Docker 引擎适配器将原始 Docker 图层信息转换为 Dive 使用的通用 Layer 结构。

来源: dive/image/docker/layer.go10-30

交互性和导航

用户可以使用键盘快捷键在图层视图中导航图层

按键绑定描述
上/K向上移动一个图层
下/J向下移动一个图层
Ctrl+A显示直到选定图层的汇总更改
Ctrl+L仅显示选定图层中的更改
Tab键在图层视图和文件树视图之间切换焦点

当选择一个图层时,文件树视图(右侧窗格)将更新以显示

  1. 仅该特定图层引入的更改(Ctrl+L 模式)
  2. 直到并包括该图层的累积文件系统状态(Ctrl+A 模式)

来源: README.md256-274

与文件树视图的关系

图层视图和文件树视图是紧密耦合的组件

  1. 图层视图中的每个图层都包含一个指向 FileTree 对象的引用,该对象代表了该图层的层次结构文件系统。
  2. 当用户选择一个图层时,相应的目录树将在文件树视图中显示。
  3. 图层视图控制文件树视图显示仅选定图层的更改还是汇总的更改。

来源: README.md55-60 dive/image/layer.go16-24

配置选项

图层视图的行为可以通过 Dive 的配置文件进行自定义

此配置决定了默认视图模式 - 在选择图层时是仅显示图层特定的更改还是汇总的更改。

来源: README.md338-340

实现细节

图层视图依赖于几个关键组件

  1. 图层模型:在 dive/image/layer.go 中定义了图层视图使用的 `Layer` 数据结构和字符串表示方法。

  2. 适配器模式:特定于容器引擎的适配器(如 Docker 适配器)将平台特定的图层信息转换为 Dive 的通用图层模型。

  3. UI 控制器:管理用户交互、图层选择和视图更新。

图层结构体的 String() 方法尤为重要,因为它会格式化图层信息以供图层视图显示。

来源: dive/image/layer.go43-52

总结

图层视图为探索容器镜像提供了关键的导航界面。它按顺序显示图层,允许用户选择图层进行详细检查,并控制如何在文件树视图中呈现更改。通过键盘快捷键和配置选项,用户可以自定义其分析体验,以更好地理解镜像构成并识别优化机会。