菜单

Docker 引擎集成

相关源文件

目的与范围

本文档详细介绍了 Dive 如何与 Docker 引擎交互以检索、构建和分析 Docker 容器镜像。Docker 引擎集成允许 Dive 直接从本地 Docker 守护进程访问镜像,从而无需将镜像导出到文件即可进行分析。有关分析 Docker 存档文件的信息,请参阅 Docker 存档处理

架构概述

Docker 引擎集成实现了 Dive 的 Resolver 接口,提供了用于获取镜像、构建镜像和从 Docker 守护进程提取内容的方法。

来源: dive/image/docker/engine_resolver.go1-197 dive/image/resolver.go1-15

引擎解析器实现

Docker 引擎解析器实现了 Dive 的 Resolver 接口,提供了与 Docker 交互的能力。

来源: dive/image/docker/engine_resolver.go23-137 dive/image/resolver.go5-14

镜像获取流程

当 Dive 需要检索 Docker 镜像进行分析时,它会使用 Docker 引擎解析器的 Fetch 方法。

  1. 解析器尝试连接到 Docker 守护进程。
  2. 它检查镜像是否已在本地存在。
  3. 如果未找到,它会尝试从注册表中拉取镜像。
  4. 镜像可用后,它会将镜像导出为存档。
  5. 存档将被处理,以创建 Dive 的内部镜像表示。

来源: dive/image/docker/engine_resolver.go34-46 dive/image/docker/engine_resolver.go69-137

Docker 主机解析

解析器使用优先顺序来确定要连接的 Docker 主机。

  1. DOCKER_HOST 环境变量(优先级最高)
  2. 当前 Docker 上下文中的主机(通过 DOCKER_CONTEXT 环境变量指定)
  3. Docker 配置文件中的默认上下文主机
  4. 操作系统的默认 Docker 主机(优先级最低)

为远程 Docker 主机的 SSH 连接提供了特殊处理。

来源: dive/image/docker/engine_resolver.go139-197

构建镜像

Dive 可以使用 Docker 引擎构建 Docker 镜像,然后立即对其进行分析。

  1. 解析器会创建一个临时文件来存储镜像 ID。
  2. 它会检查是否指定了 Dockerfile/Containerfile 路径。
  3. 如果未指定,它会尝试在提供的构建上下文中查找一个。
  4. 它使用构建参数和临时 ID 文件运行 docker build 命令。
  5. 构建完成后,它会读取镜像 ID 并获取镜像以进行分析。

来源: dive/image/docker/build.go17-47 dive/image/docker/build.go60-84 dive/image/docker/engine_resolver.go48-54

内容提取

Docker 引擎解析器还支持从镜像中提取特定内容。

  1. 解析器从 Docker 获取镜像存档。
  2. 它调用一个辅助函数从存档中提取特定的层或文件。
  3. 提取的内容可供用户使用。

来源: dive/image/docker/engine_resolver.go56-67

Docker 客户端配置

连接 Docker 守护进程时,Dive 会

  1. 使用适当的选项创建一个 Docker 客户端。
  2. 处理 SSH 连接的特殊情况。
  3. 如果需要,设置 TLS 验证。
  4. 与守护进程协商 API 版本。

这确保了与各种 Docker 引擎配置(包括远程 Docker 主机)的兼容性。

来源: dive/image/docker/engine_resolver.go69-107

与镜像分析集成

在 Docker 引擎解析器提供镜像后,Dive 的分析组件会

  1. 从镜像中提取每个层。
  2. 构建表示每个层文件系统的文件树。
  3. 比较层以识别更改。
  4. 计算效率指标。

这使得 Dive 能够在无需特殊导出或准备的情况下,提供对 Docker 镜像的详细洞察。

来源: dive/image/docker/testing.go23-34