用于探索 Docker 镜像、层内容以及发现缩小 Docker/OCI 镜像大小的方法的工具。
要分析 Docker 镜像,只需使运行 dive tag/id/digest
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 质量! 如果您需要新功能或发现错误,请随时提交问题 :)
按层级显示 Docker 镜像内容
当您在左侧选择一个层级时,右侧会显示该层级及其所有先前层级的内容。此外,您还可以使用箭头键全面探索文件树。
显示每个层级的更改
文件树中会显示已更改、修改、添加或删除的文件。您可以调整此选项以显示特定层的更改,或显示截至该层的汇总更改。
估算“镜像效率”
左下方窗格显示基本层级信息和一个实验性指标,该指标可以估算镜像包含多少浪费的空间。这可能是由于跨层复制文件、跨层移动文件或未完全删除文件造成的。同时会显示百分比“分数”和总浪费的文件空间。
快速构建/分析周期
您可以使用一个命令构建 Docker 镜像并立即进行分析:
dive build -t some-tag
。
您只需将 docker build
命令替换为相同的 dive build
命令即可。
CI 集成
分析镜像并根据镜像效率和空间浪费情况得出通过/失败结果。只需在调用任何有效的 dive 命令时,在环境中设置 CI=true
即可。
支持多种镜像源和容器引擎
使用 --source
选项,您可以选择从何处获取容器镜像:
dive <your-image> --source <source>
or
dive <source>://<your-image>
有效的 source
选项如下:
docker
:Docker 引擎(默认选项)docker-archive
:从磁盘创建 Docker Tar 存档podman
:Podman 引擎(仅限 Linux)Ubuntu/Debian
Using debs:
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:
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 守护进程。
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
If you use Homebrew:
brew install dive
If you use MacPorts:
sudo port install dive
或者从发布页面下载最新的 Darwin 版本。
Windows
如果您使用 Chocolatey
choco install dive
If you use scoop
scoop install main/dive
If you use winget:
winget install --id wagoodman.dive
或者从 发布页面下载最新的 Windows 版本。
Go tools
需要 Go 版本 1.10 或更高版本。
go install github.com/wagoodman/dive@latest
注意:以这种方式安装时,运行“dive -v”时将看不到正确的版本。
Nix/NixOS
On NixOS:
nix-env -iA nixos.dive
On non-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 套接字文件:
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:
# 如果效率测量值低于 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 + 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
# 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
。