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

要分析一个 Docker 镜像,只需使用镜像标签/ID/摘要运行 dive:
dive <your-image-tag>
或者你可以直接通过 Docker 使用 dive:
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive"
dive <your-image-tag>
# 例如
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>

这是测试版质量! 如果你想要新功能或发现 bug,请随时提交 issue :)
按层显示 Docker 镜像内容
当你在左侧选择一个层时,右侧会显示该层及之前所有层的组合内容。此外,你可以使用方向键完全浏览文件树。
指示每层的变化
文件树中会标出已更改、修改、添加或删除的文件。你可以调整此设置,显示特定层的变化,或累计到当前层的变化。
估算“镜像效率”
左下方面板显示基本层信息和一个实验性指标,该指标将估算你的镜像包含多少浪费的空间。这可能来自跨层重复文件、跨层移动文件或未完全删除文件。同时提供百分比“得分”和总浪费文件空间。
快速构建/分析周期
你可以构建一个 Docker 镜像并通过一条命令立即进行分析:
dive build -t some-tag .
你只需将 docker build 命令替换为相同的 dive build 命令即可。
CI 集成
分析镜像并根据镜像效率和浪费空间获得通过/失败结果。在调用任何有效的 dive 命令时,只需在环境中设置 CI=true 即可。
支持多镜像源和容器引擎
使用 --source 选项,你可以选择从何处获取容器镜像:
dive <your-image> --source <source>
或
dive <source>://<your-image>
有效的 source 选项如下:
docker:Docker 引擎(默认选项)docker-archive:磁盘上的 Docker Tar 归档podman:Podman 引擎(仅 Linux)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
或者从 releases 页面 下载最新的 Darwin 构建包。
Windows
如果你使用 Chocolatey
choco install dive
如果你使用 scoop
scoop install main/dive
如果你使用 winget:
winget install --id wagoodman.dive
或者从 releases 页面 下载最新的 Windows 构建包。
Go 工具 需要 Go 1.10 或更高版本。
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
# 或者
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...>
Docker for Windows(显示 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 主机指定为环境变量才能拉取本地镜像:
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 配置路径。
| 按键绑定 | 描述 |
|---|---|
| Ctrl + C 或 Q | 退出 |
| Tab | 在层视图和文件树视图之间切换 |
| Ctrl + F | 过滤文件 |
| ESC | 关闭文件过滤 |
| PageUp 或 U | 向上翻页 |
| PageDown 或 D | 向下翻页 |
| Up 或 K | 在页面内向上移动一行 |
| Down 或 J | 在页面内向下移动一行 |
| Ctrl + A | 层视图:查看累计镜像修改 |
| Ctrl + L | 层视图:查看当前层修改 |
| Space | 文件树视图:折叠/展开目录 |
| Ctrl + Space | 文件树视图:折叠/展开所有目录 |
| Ctrl + A | 文件树视图:显示/隐藏添加的文件 |
| Ctrl + R | 文件树视图:显示/隐藏删除的文件 |
| Ctrl + M | 文件树视图:显示/隐藏修改的文件 |
| Ctrl + U | 文件树视图:显示/隐藏未修改的文件 |
| Ctrl + B | 文件树视图:显示/隐藏文件属性 |
| PageUp 或 U | 文件树视图:向上翻页 |
| PageDown 或 D | 文件树视图:向下翻页 |
无需配置,但你可以创建配置文件并覆盖值:
# 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