一款用于探索 Docker 镜像、层内容,并发现缩小 Docker/OCI 镜像体积方法的工具。

要分析 Docker 镜像,只需使用镜像标签/ID/摘要运行 dive:
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
或者,如果您想构建自己的镜像,然后直接进入分析:
dive build -t <some-tag> .
在 macOS 上构建(仅支持 Docker 容器引擎):
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 质量! 如果你想添加新功能或发现 bug,欢迎提交 issue :)
按层显示 Docker 镜像内容
当你在左侧选择一个层时,右侧会显示该层与之前所有层合并后的内容。此外,你可以使用方向键完整浏览文件树。
指示每一层中的变更
已更改、被修改、新增或删除的文件会在文件树中指示出来。可以调整为显示特定层的变更,或显示截至该层的累计变更。
估算“镜像效率”
左下方面板显示基本的层信息,以及一个实验性指标,用于推测镜像中包含多少浪费的空间。这可能来自跨层复制文件、跨层移动文件或未完全删除文件。该指标同时提供百分比“得分”和浪费的文件空间总量。
快速的构建/分析循环
你可以用一条命令构建 Docker 镜像并立即进行分析:
dive build -t some-tag .
你只需将 docker build 命令替换为相同的 dive build 命令即可。
CI 集成
分析镜像,并根据镜像效率和浪费空间获得通过/失败结果。只需在调用任何有效的 dive 命令时在环境中设置 CI=true。
支持多种镜像来源和容器引擎
通过 --source 选项,你可以选择从何处获取容器镜像:
dive <your-image> --source <source>
或以 <source>:// 方案为图像添加前缀:
dive <source>://<your-image>
基于文件的源也采用其他 anchore 工具使用的 <source>:<path> 形式(例如 dive oci-dir:./layout)。
对于其他所有源,单个冒号会被解析为镜像名称和标签,因此 dive docker:dind 会分析
docker:dind 镜像。
| 源 | 从何处读取镜像 |
|---|---|
docker | Docker 引擎(默认)。本地缺失的镜像会通过 docker API 拉取,凭据来自你的 docker 配置。会遵循 DOCKER_HOST、DOCKER_CONTEXT 以及当前 docker 上下文 |
podman | Podman。在 linux 上直接读取本地存储(无需 socket,参见 containers-storage,像 myapp 这样的短名称也能找到 podman 的 localhost/myapp),否则回退到 podman socket。在 macOS 上使用运行中的 podman 机器的 API socket(通过 podman machine inspect 找到);CONTAINER_HOST=unix://... 可覆盖它,ssh 连接会被拒绝 |
docker-archive | 磁盘上的 docker save tarball,或 OCI 归档(docker-tar 是别名) |
oci-archive | 磁盘上的 OCI 镜像布局 tarball |
oci-dir | 磁盘上的 OCI 镜像布局目录 |
registry | 一个 registry,无需容器引擎(凭据来自你的 docker 配置)。私有 IP 地址上的 registry 会被拒绝,因为它们会通过明文 http 访问 |
containerd | containerd 守护进程(CONTAINERD_NAMESPACE 选择命名空间) |
containers-storage | 本地 podman/buildah 存储(仅限 linux,见下文) |
auto | 自动检测:先检测磁盘上的文件,然后依次是 docker、podman、containerd 和 containers-storage,最后从 registry 拉取。会报告它选中的源,因为本地引擎都没有的镜像会静默地从 registry 获取(短名称则来自 Docker Hub)。仅对 --source 有效,不能作为 scheme 使用 |
对于多平台镜像,--platform 选择要分析的变体(例如 --platform linux/arm64)。docker save
tarball 只包含单个平台,当不匹配时 dive 会报告。
containers-storage 支持仅在带有 containers_image_openpgp 构建标签时才会编译进来,linux
发布构建(以及 docker 镜像)具备该标签。没有它时,该源会报告其不可用。要自行构建:
go build -tags containers_image_openpgp,exclude_graphdriver_btrfs ./cmd/dive。
JSON 导出
--json <path> 会跳过 UI 并将分析写入文件。每个层的 id 是该层的 diff ID(与 digestId 相同的值)。
Ubuntu/Debian
使用 deb 包:
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
使用 snap:
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
[!CAUTION] 如果你通过
apt-get安装了 Docker,则不推荐使用 Snap 方式,因为它可能会破坏你现有的 Docker 守护进程。
RHEL/Centos
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 安装:
pacman -S dive
Mac
如果你使用 Homebrew:
brew install dive
如果你使用 MacPorts:
sudo port install dive
或者从发布页面下载最新的 Darwin 构建版本。
Windows
如果你使用 Chocolatey
choco install dive
如果你使用 scoop
scoop install main/dive
如果你使用 winget:
winget install --id wagoodman.dive
或从发布页面下载最新的 Windows 版本。
Go 工具
需要 Go 1.26 或更高版本(在 Linux 上添加 -tags containers_image_openpgp,exclude_graphdriver_btrfs 以支持 containers-storage)。
go install github.com/wagoodman/dive@latest
注意:以这种方式安装时,运行 dive -v 将不会显示正确的版本。
Nix/NixOS
在 NixOS 上:
nix-env -iA nixos.dive
在非 NixOS 系统上(Linux、Mac)
nix-env -iA nixpkgs.dive
X-CMD
x-cmd 是一个 Posix Shell 工具箱,提供使用 shell 和 awk 构建的轻量级包管理器。
x env use dive
Docker
docker pull docker.io/wagoodman/dive
# or alternatively
docker pull ghcr.io/wagoodman/dive
运行时需要包含 Docker socket 文件:
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
docker.io/wagoodman/dive:latest <dive arguments...>
适用于 Windows 的 Docker(显示的是 PowerShell 兼容的换行符;为兼容命令提示符,请折叠为单行)
docker run --rm -it `
-v /var/run/docker.sock:/var/run/docker.sock `
docker.io/wagoodman/dive:latest <dive arguments...>
注意: 根据你本地运行的 Docker 版本,你可能需要将 Docker API 版本指定为环境变量:
DOCKER_API_VERSION=1.37 dive ...
或者,如果你使用 docker 镜像运行:
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 host 指定为环境变量,以便拉取本地镜像:
export DOCKER_HOST=$(docker context inspect -f '{{ .Endpoints.docker.Host }}')
当使用环境变量 CI=true 运行 dive 时,dive 的 UI 将被绕过,转而分析你的 docker 镜像,并通过返回码给出通过/失败指示。目前支持通过 .dive-ci 文件配置三项指标,你可以将该文件放在仓库根目录下:
rules:
# If the efficiency is measured below X%, mark as failed.
# Expressed as a ratio between 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
# If the amount of wasted space makes up for X% or more of the image, mark as failed.
# Note: the base image layer is NOT included in the total image size.
# Expressed as a ratio between 0-1; fails if the threshold is met or crossed.
highestUserWastedPercent: 0.20
你可以使用 --ci-config 选项覆盖 CI 配置路径。