wagoodman/dive
GitHub: wagoodman/dive
Dive 是一款用于探索 Docker 镜像各层内容、分析文件变更并评估镜像效率以帮助减小镜像体积的工具。
Stars: 53761 | Forks: 1983
# dive
[](https://github.com/wagoodman/dive/releases/latest)
[](https://github.com/wagoodman/dive/actions/workflows/validations.yaml)
[](https://goreportcard.com/report/github.com/wagoodman/dive)
[](https://github.com/wagoodman/dive/blob/main/LICENSE)
[](https://www.paypal.me/wagoodman)
**一个用于探索 Docker 镜像、分析各层内容以及发现缩小 Docker/OCI 镜像大小的方法的工具。**

要分析一个 Docker 镜像,只需使用镜像标签/ID/digest 运行 dive:
```
dive
```
或者你可以直接使用 Docker 运行 dive:
```
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive"
dive
# 例如
dive nginx:latest
```
或者如果你想构建镜像然后立即跳转去分析它:
```
dive build -t .
```
在 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 .
```
此外,你可以在 CI 流水线中运行它,以确保将浪费的空间降至最低(这将跳过 UI):
```
CI=true dive
```

**这是测试版质量!** *如果你想要新功能或发现错误,请随时提交 issue :)*
## 基本功能
**按分层展示 Docker 镜像内容**
当你在左侧选择一个层时,右侧会显示该层与所有先前层合并后的内容。此外,你可以使用箭头键完全探索文件树。
**指示每个层中的更改内容**
文件树中会指示已更改、修改、添加或删除的文件。这可以进行调整以显示特定层的更改,或截至该层的聚合更改。
**估算“镜像效率”**
左下方面板显示基本层信息和一个实验性指标,该指标将猜测你的镜像包含多少浪费的空间。这可能是因为在层之间复制文件、在层之间移动文件或未完全删除文件。同时提供了百分比“得分”和总浪费的文件空间。
**快速构建/分析周期**
你可以用一个命令构建 Docker 镜像并立即进行分析:
`dive build -t some-tag .`
你只需要用相同的 `dive build` 命令替换你的 `docker build` 命令。
**CI 集成**
分析镜像并根据镜像效率和浪费空间获取通过/失败结果。只需在调用任何有效的 dive 命令时在环境中设置 `CI=true`。
**支持多种镜像源和容器引擎**
使用 `--source` 选项,你可以选择从何处获取容器镜像:
```
dive --source
```
或
```
dive ://
```
有效的 `source` 选项如下:
- `docker`:Docker 引擎(默认选项)
- `docker-archive`:来自磁盘的 Docker Tar 归档文件
- `podman`:Podman 引擎(仅限 Linux)
## 安装说明
**Ubuntu/Debian**
使用 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
```
使用 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
```
**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 仓库](https://archlinux.org/packages/extra/x86_64/dive/) 中获取,并可以通过 [pacman](https://wiki.archlinux.org/title/Pacman) 安装:
```
pacman -S dive
```
**Mac**
如果你使用 [Homebrew](https://brew.sh):
```
brew install dive
```
如果你使用 [MacPorts](https://www.macports.org):
```
sudo port install dive
```
或者从 [发布页面](https://github.com/wagoodman/dive/releases/latest) 下载最新的 Darwin 构建。
**Windows**
如果你使用 [Chocolatey](https://chocolatey.org)
```
choco install dive
```
如果你使用 [scoop](https://scoop.sh/)
```
scoop install main/dive
```
如果你使用 [winget](https://learn.microsoft.com/en-gb/windows/package-manager/):
```
winget install --id wagoodman.dive
```
或者从 [发布页面](https://github.com/wagoodman/dive/releases/latest) 下载最新的 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](https://www.x-cmd.com/) 是一个 **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
```
Docker for Windows(显示 PowerShell 兼容的换行符;为了与命令提示符兼容,请将其合并为一行)
```
docker run --rm -it `
-v /var/run/docker.sock:/var/run/docker.sock `
docker.io/wagoodman/dive:latest
```
**注意:**根据你本地运行的 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
```
如果你使用备用运行时(Colima 等),你可能需要将 docker host 指定为环境变量,以便拉取本地镜像:
```
export DOCKER_HOST=$(docker context inspect -f '{{ .Endpoints.docker.Host }}')
```
## CI 集成
当使用环境变量 `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 | 文件树视图:向下滚动一页
## UI 配置
无需配置,但是,你可以创建一个配置文件并覆盖值:
```
# 支持的选项为 "docker" 和 "podman"
container-engine: docker
# 即使解析 image archive 时出现错误,也继续进行分析
ignore-errors: false
log:
enabled: true
path: ./dive.log
level: info
# 注意:您可以通过逗号分隔值来指定多个 binding。
# 注意:UI hinting 源自第一个 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:
# You can change the default files shown in the filetree (right pane). All diff types are shown by default.
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:
# Enable showing all changes from this layer and every previous layer
show-aggregated-changes: false
```
dive 将在以下位置搜索配置文件:
- `$XDG_CONFIG_HOME/dive/*.yaml`
- `$XDG_CONFIG_DIRS/dive/*.yaml`
- `~/.config/dive/*.yaml`
- `~/.dive.yaml`
如果需要,可以使用 `.yml` 代替 `.yaml`。
标签:Docker, EVTX分析, Go, Layer, LNA, Ruby工具, 二进制发布, 安全防御评估, 容器, 开源工具, 性能分析, 文件系统, 日志审计, 构建分析, 请求拦截, 镜像优化, 镜像分析, 镜像瘦身