
Инструмент для исследования каждого слоя в образе Docker
Инструмент для изучения Docker-образов, содержимого слоев и поиска способов уменьшить размер вашего Docker/OCI образа.

Чтобы проанализировать Docker-образ, просто запустите dive с тегом/id/дайджестом образа:
dive <your-image-tag>
или вы можете запустить dive через 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>

Это качество бета-версии! Не стесняйтесь создавать issue, если хотите новую функцию или нашли ошибку :)
Показ содержимого Docker-образа, разбитого по слоям
Когда вы выбираете слой слева, справа отображается содержимое этого слоя вместе со всеми предыдущими слоями. Кроме того, вы можете полностью исследовать дерево файлов с помощью клавиш со стрелками.
Отображение изменений в каждом слое
Файлы, которые были изменены, модифицированы, добавлены или удалены, отмечаются в дереве файлов. Это можно настроить для отображения изменений для конкретного слоя или совокупных изменений вплоть до этого слоя.
Оценка «эффективности образа»
Нижняя левая панель показывает основную информацию о слоях и экспериментальный показатель, который оценивает, сколько лишнего места занимает ваш образ. Это может быть из-за дублирования файлов между слоями, перемещения файлов между слоями или неполного удаления файлов. Отображаются как процентная «оценка», так и общий объем потраченного впустую места.
Быстрые циклы сборки/анализа
Вы можете собрать Docker-образ и сразу выполнить его анализ одной командой: dive build -t some-tag . Вам нужно лишь заменить команду docker build на ту же самую dive build.
Интеграция с CI
Анализируйте образ и получайте результат прохождения/неудачи на основе эффективности образа и потраченного впустую места. Просто установите CI=true в окружении при вызове любой команды dive.
Поддержка нескольких источников образов и контейнерных движков
С помощью опции --source вы можете выбрать, откуда загрузить образ контейнера:
dive <your-image> --source <source>
или
dive <source>://<your-image>
Допустимые опции source:
docker: Docker engine (опция по умолчанию)docker-archive: Docker-архив Tar с дискаpodman: Podman engine (только 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] Метод Snap не рекомендуется, если вы установили Docker через
apt-get, так как это может нарушить работу существующего Docker-демона.См. также: https://github.com/wagoodman/dive/issues/546
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.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
# 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 для Windows (показаны совместимые с PowerShell переносы строк; сверните в одну строку для совместимости с Command Prompt)
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 }}')
При запуске dive с переменной окружения CI=true UI dive будет пропущен, и вместо этого будет проанализирован ваш 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 с помощью опции --ci-config.
Конфигурация не требуется, однако вы можете создать файл конфигурации и переопределить значения:
# 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:
# 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 при желании.
| Комбинация клавиш | Описание |
|---|
| 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 | Вид дерева файлов: прокрутка на страницу вниз |