wagoodman/dive

GitHub: wagoodman/dive

Dive 是一款用于探索 Docker 镜像各层内容、分析文件变更并评估镜像效率以帮助减小镜像体积的工具。

Stars: 53761 | Forks: 1983

# dive [![GitHub release](https://img.shields.io/github/release/wagoodman/dive.svg)](https://github.com/wagoodman/dive/releases/latest) [![Validations](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/b6a353f33e064022.svg)](https://github.com/wagoodman/dive/actions/workflows/validations.yaml) [![Go Report Card](https://goreportcard.com/badge/github.com/wagoodman/dive)](https://goreportcard.com/report/github.com/wagoodman/dive) [![License: MIT](https://img.shields.io/badge/License-MIT%202.0-blue.svg)](https://github.com/wagoodman/dive/blob/main/LICENSE) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg?style=flat)](https://www.paypal.me/wagoodman) **一个用于探索 Docker 镜像、分析各层内容以及发现缩小 Docker/OCI 镜像大小的方法的工具。** ![Image](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/af0646cc6e064023.gif) 要分析一个 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 ``` ![Image](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/f1db467b8a064025.png) **这是测试版质量!** *如果你想要新功能或发现错误,请随时提交 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 + 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 配置 无需配置,但是,你可以创建一个配置文件并覆盖值: ``` # 支持的选项为 "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工具, 二进制发布, 安全防御评估, 容器, 开源工具, 性能分析, 文件系统, 日志审计, 构建分析, 请求拦截, 镜像优化, 镜像分析, 镜像瘦身