dive查看Docker镜像中每一层内容的工具

dive

用于探索 Docker 镜像、层内容以及发现缩小 Docker/OCI 镜像大小的方法的工具。

要分析 Docker 镜像,只需使运行 dive tag/id/digest

bash 复制代码
dive <your-image-tag>

或者你可以直接使用 Docker:

复制代码
alias dive="docker run -ti --rm  -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive"
dive <your-image-tag>

# for example
dive nginx:latest

或者如果你想要构建你的图像然后直接跳到分析它:

bash 复制代码
dive build -t <some-tag> .

在 macOS 上构建(仅支持 Docker 容器引擎):

bash 复制代码
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$(pwd)":"$(pwd)" \
-w "$(pwd)" \
-v "$HOME/.dive.yaml":"$HOME/.dive.yaml" \
docker.io/wagoodman/dive:latest build -t <some-tag> .

此外,您还可以在 CI 管道中运行以下命令,以确保将空间浪费降至最低(这会跳过 UI):

复制代码
CI=true dive <your-image>

这是 Beta 质量! 如果您需要新功能或发现错误,请随时提交问题 :)

基本功能

按层级显示 Docker 镜像内容

当您在左侧选择一个层级时,右侧会显示该层级及其所有先前层级的内容。此外,您还可以使用箭头键全面探索文件树。

显示每个层级的更改

文件树中会显示已更改、修改、添加或删除的文件。您可以调整此选项以显示特定层的更改,或显示截至该层的汇总更改。

估算“镜像效率”

左下方窗格显示基本层级信息和一个实验性指标,该指标可以估算镜像包含多少浪费的空间。这可能是由于跨层复制文件、跨层移动文件或未完全删除文件造成的。同时会显示百分比“分数”和总浪费的文件空间。

快速构建/分析周期

您可以使用一个命令构建 Docker 镜像并立即进行分析:
dive build -t some-tag

您只需将 docker build 命令替换为相同的 dive build 命令即可。

CI 集成

分析镜像并根据镜像效率和空间浪费情况得出通过/失败结果。只需在调用任何有效的 dive 命令时,在环境中设置 CI=true 即可。

支持多种镜像源和容器引擎

使用 --source 选项,您可以选择从何处获取容器镜像:

bash 复制代码
dive <your-image> --source <source>

or

bash 复制代码
dive <source>://<your-image>

有效的 source 选项如下:

  • docker:Docker 引擎(默认选项)
  • docker-archive:从磁盘创建 Docker Tar 存档
  • podman:Podman 引擎(仅限 Linux)

安装

Ubuntu/Debian

Using debs:

bash 复制代码
DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -fOL "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb"
sudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb

Using snap:

bash 复制代码
sudo snap install docker
sudo snap install dive
sudo snap connect dive:docker-executables docker:docker-executables
sudo snap connect dive:docker-daemon docker:docker-daemon

如果您通过 apt-get 安装 Docker,则不建议使用 Snap 方法,因为它可能会破坏您现有的 Docker 守护进程。

另请参阅:https://github.com/wagoodman/dive/issues/546

RHEL/Centos

bash 复制代码
DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -fOL "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.rpm"
rpm -i dive_${DIVE_VERSION}_linux_amd64.rpm

Arch Linux

可在 extra 仓库 中找到,并且可以通过 pacman 安装:

bash 复制代码
pacman -S dive

Mac

If you use Homebrew:

bash 复制代码
brew install dive

If you use MacPorts:

bash 复制代码
sudo port install dive

或者从发布页面下载最新的 Darwin 版本。

Windows

如果您使用 Chocolatey

powershell 复制代码
choco install dive

If you use scoop

powershell 复制代码
scoop install main/dive

If you use winget:

powershell 复制代码
winget install --id wagoodman.dive

或者从 发布页面下载最新的 Windows 版本。

Go tools
需要 Go 版本 1.10 或更高版本。

bash 复制代码
go install github.com/wagoodman/dive@latest

注意:以这种方式安装时,运行“dive -v”时将看不到正确的版本。

Nix/NixOS

On NixOS:

bash 复制代码
nix-env -iA nixos.dive

On non-NixOS (Linux, Mac)

bash 复制代码
nix-env -iA nixpkgs.dive

X-CMD

x-cmdPosix Shell 工具箱,提供使用 shell 和 awk 构建的轻量级包管理器。

sh 复制代码
x env use dive

Docker

bash 复制代码
docker pull docker.io/wagoodman/dive
# or alternatively
docker pull ghcr.io/wagoodman/dive

运行时,您需要包含 Docker 套接字文件:

bash 复制代码
docker run --rm -it \
    -v /var/run/docker.sock:/var/run/docker.sock \
    docker.io/wagoodman/dive:latest <dive arguments...>

Docker for Windows(显示与 PowerShell 兼容的换行符;折叠为一行以实现命令提示符兼容性)

bash 复制代码
docker run --rm -it `
    -v /var/run/docker.sock:/var/run/docker.sock `
    docker.io/wagoodman/dive:latest <dive arguments...>

**注意:**根据您在本地运行的 docker 版本,您可能需要将 docker API 版本指定为环境变量:

bash 复制代码
   DOCKER_API_VERSION=1.37 dive ...

或者如果你使用 docker 镜像运行:

bash 复制代码
docker run --rm -it \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -e DOCKER_API_VERSION=1.37 \
    docker.io/wagoodman/dive:latest <dive arguments...>

如果您正在使用备用运行时(Colima 等),那么您可能需要将 docker 主机指定为环境变量才能拉取本地映像:

bash 复制代码
   export DOCKER_HOST=$(docker context inspect -f '{{ .Endpoints.docker.Host }}')

CI 集成

当使用环境变量“CI=true”运行 dive 时,dive UI 将被绕过,而是会分析你的 Docker 镜像,并通过返回码指示其通过/失败。目前,通过“.dive-ci”文件支持三种指标,你可以将该文件放在你的仓库根目录下:

复制代码
rules:
  # 如果效率测量值低于 X%,则标记为失败。
  # 以 0-1 之间的比率表示。
  lowestEfficiency: 0.95

  # If the amount of wasted space is at least X or larger than X, mark as failed.
  # Expressed in B, KB, MB, and GB.
  highestWastedBytes: 20MB

  # 如果浪费的空间量占图像的 X% 或更多,则标记为失败。
  # 注意:基础图像层不包含在总图像大小中。
  # 表示为 0-1 之间的比率;如果达到或超过阈值,则失败。
  highestUserWastedPercent: 0.20

您可以使用“--ci-config”选项覆盖 CI 配置路径。

按键绑定

按键绑定 说明
Ctrl + CQ 退出
Tab 在图层和文件树视图之间切换
Ctrl + F 筛选文件
ESC 关闭筛选文件
PageUpU 向上滚动一页
PageDownD 向下滚动一页
UpK 在页面内向上移动一行
DownJ 在页面内向下移动一行
Ctrl + A 图层视图:查看汇总的图像修改
Ctrl + L 图层视图:查看当前图层修改
Space 文件树视图:折叠/展开目录
Ctrl + Space 文件树视图:折叠/展开所有目录
Ctrl + A 文件树视图:显示/隐藏已添加的文件
Ctrl + R 文件树视图:显示/隐藏已删除的文件
Ctrl + M 文件树视图:显示/隐藏已修改的文件
Ctrl + U 文件树视图:显示/隐藏未修改的文件
Ctrl + B 文件树视图:显示/隐藏文件属性
PageUpU 文件树视图:向上滚动一页
PageDownD 文件树视图:向下滚动一页

UI 配置

无需配置,但您可以创建配置文件并覆盖以下值:

yaml 复制代码
# supported options are "docker" and "podman"
container-engine: docker
# continue with analysis even if there are errors parsing the image archive
ignore-errors: false
log:
  enabled: true
  path: ./dive.log
  level: info

# Note: you can specify multiple bindings by separating values with a comma.
# Note: UI hinting is derived from the first binding
keybinding:
  # Global bindings
  quit: ctrl+c
  toggle-view: tab
  filter-files: ctrl+f, ctrl+slash
  close-filter-files: esc
  up: up,k
  down: down,j
  left: left,h
  right: right,l

  # Layer view specific bindings
  compare-all: ctrl+a
  compare-layer: ctrl+l

  # File view specific bindings
  toggle-collapse-dir: space
  toggle-collapse-all-dir: ctrl+space
  toggle-added-files: ctrl+a
  toggle-removed-files: ctrl+r
  toggle-modified-files: ctrl+m
  toggle-unmodified-files: ctrl+u
  toggle-filetree-attributes: ctrl+b
  page-up: pgup,u
  page-down: pgdn,d

diff:
  # 您可以更改文件树(右侧窗格)中显示的默认文件。默认情况下,显示所有差异类型。
  hide:
    - added
    - removed
    - modified
    - unmodified

filetree:
  # The default directory-collapse state
  collapse-dir: false

  # The percentage of screen width the filetree should take on the screen (must be >0 and <1)
  pane-width: 0.5

  # Show the file attributes next to the filetree
  show-attributes: true

layer:
  # 启用显示此图层和每个先前图层的所有更改
  show-aggregated-changes: false

dive 将在以下位置搜索配置:

  • $XDG_CONFIG_HOME/dive/*.yaml
  • $XDG_CONFIG_DIRS/dive/*.yaml
  • ~/.config/dive/*.yaml
  • ~/.dive.yaml

如果需要,可以使用 .yml 代替 .yaml

关于项目

用于查看 Docker 镜像、层内容以及发现缩小 Docker/OCI 镜像大小的方法的工具。
MIT
Golang
52,241
1916
361
2018-05-13
2025-10-07

增长趋势 - stars