菜单

Docker 归档处理

相关源文件

目的与范围

本文档介绍了 Dive 如何直接从 tar 文件处理 Docker 镜像归档。Docker 归档文件处理使 Dive 能够在不需要运行 Docker 守护进程的情况下分析 Docker 镜像。有关与 Docker 引擎 API 交互的信息,请参阅 Docker Engine Integration

概述

Docker 归档文件处理允许 Dive 分析以 .tar 格式存储的 Docker 镜像,此类文件可以使用 docker save 等命令创建。此功能对于离线分析或在 Docker 守护进程不可用的环境中分析镜像特别有用。

来源: dive/image/docker/image_archive.go21-301

Docker 归档文件结构

Docker 归档文件(通过 docker save 创建)是一个 tar 文件,其中包含:

  1. Layer tar 文件 - 每个层都存储为单独的 tar 文件(有时经过压缩)
  2. manifest.json - 包含镜像元数据和层顺序信息
  3. 镜像配置文件 - JSON 文件,包含详细的镜像元数据,包括历史记录和层详细信息

对于 OCI 兼容格式(自 Docker 25 起使用),结构略有不同,内容组织在 blobs/ 目录下,并且可能不存在 manifest.json。

来源: dive/image/docker/image_archive.go162-195

镜像归档文件组件

ImageArchive 结构是 Docker 归档文件处理的核心组件

来源: dive/image/docker/image_archive.go21-25

归档文件处理流程

Docker 归档文件处理遵循以下主要步骤:

  1. 打开包含 Docker 镜像的 tar 文件
  2. 处理归档文件内容
    • 提取层 tar 文件并构建文件树
    • 收集 JSON 配置文件
  3. 解析 manifest 和 config 文件
  4. 构建 Dive 可以分析的镜像表示

来源: dive/image/docker/image_archive.go27-198 dive/image/docker/image_archive.go250-301

层处理

Docker 归档文件中的层被处理以提取文件信息和构建文件树

来源: dive/image/docker/image_archive.go200-219 dive/image/docker/image_archive.go111-144

多格式支持

Dive 支持多种 Docker 镜像格式

  1. 标准 Docker 格式:包含 manifest.json 和层 tar 文件
  2. OCI 格式 (自 Docker 25 起):使用 blob 目录结构
  3. 压缩格式:
    • 未压缩的 tar
    • Gzip 压缩 (.tar.gz, .tgz)
    • Zstd 压缩

来源: dive/image/docker/image_archive.go55-70 dive/image/docker/image_archive.go91-158 dive/image/docker/image_archive.go163-188

转换为镜像表示

处理完归档文件后,ToImage 方法将 ImageArchive 转换为 Dive 的统一 Image 结构进行分析

来源: dive/image/docker/image_archive.go250-301

层历史记录和效率分析

Docker 归档文件处理器从镜像配置中提取层历史信息,用于计算层效率统计数据

来源: dive/image/docker/image_archive.go270-293 dive/image/docker/image_archive_analysis_test.go1-43

文件提取功能

Docker 归档文件处理器还包含从镜像归档中提取特定文件的函数

来源: dive/image/docker/image_archive.go303-378

与 Dive 分析管道集成

Docker 归档文件处理器通过提供除 Docker 和 Podman 引擎之外的替代镜像源,融入了 Dive 的整体架构中

来源: dive/image/docker/image_archive.go250-301

结论

Dive 中的 Docker 归档文件处理系统支持直接从 tar 文件分析 Docker 镜像,而无需 Docker 守护进程。它支持多种镜像格式,包括传统的 Docker 格式和 OCI 格式,以及各种压缩方案。ImageArchive 组件通过提取层、读取元数据和构建可用于效率分析的文件树来处理这些归档文件。