
Uma ferramenta para explorar cada camada em uma imagem Docker.
Uma ferramenta para explorar uma imagem Docker, conteúdos de camadas e descobrir maneiras de reduzir o tamanho da sua imagem Docker/OCI.

Para analisar uma imagem Docker, basta executar dive com uma tag/id/digest da imagem:
dive <your-image-tag>
ou você pode usar dive diretamente com o 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
ou se você quiser construir sua imagem e ir direto para a análise:
dive build -t <some-tag> .
Construindo no macOS (suportando apenas o mecanismo de contêiner 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> .
Além disso, você pode executar isso em seu pipeline de CI para garantir que está mantendo o espaço desperdiçado ao mínimo (isso pula a interface):
CI=true dive <your-image>

Esta é uma versão beta! Sinta-se à vontade para abrir uma issue se quiser um novo recurso ou encontrar um bug :)
Mostrar conteúdos da imagem Docker divididos por camada
Ao selecionar uma camada à esquerda, você vê os conteúdos dessa camada combinados com todas as camadas anteriores à direita. Além disso, você pode explorar completamente a árvore de arquivos com as teclas de seta.
Indicar o que mudou em cada camada
Arquivos que foram alterados, modificados, adicionados ou removidos são indicados na árvore de arquivos. Isso pode ser ajustado para mostrar mudanças de uma camada específica ou mudanças agregadas até essa camada.
Estimar "eficiência da imagem"
O painel inferior esquerdo mostra informações básicas da camada e uma métrica experimental que estima quanto espaço desperdiçado sua imagem contém. Isso pode ser devido à duplicação de arquivos entre camadas, movimentação de arquivos entre camadas ou remoção incompleta de arquivos. Tanto uma 'pontuação' percentual quanto o espaço total desperdiçado são fornecidos.
Ciclos rápidos de construção/análise
Você pode construir uma imagem Docker e fazer uma análise imediata com um comando:
dive build -t some-tag .
Você só precisa substituir seu comando docker build pelo mesmo comando dive build.
Integração CI
Analise uma imagem e obtenha um resultado de aprovação/reprovação baseado na eficiência da imagem e espaço desperdiçado. Basta definir CI=true no ambiente ao invocar qualquer comando dive válido.
Múltiplas Fontes de Imagem e Mecanismos de Contêiner Suportados
Com a opção --source, você pode selecionar de onde buscar a imagem do contêiner:
dive <your-image> --source <source>
ou
dive <source>://<your-image>
Com opções source válidas como:
docker: mecanismo Docker (a opção padrão)docker-archive: um arquivo Tar Docker do discopodman: mecanismo Podman (apenas linux)Ubuntu/Debian
Usando 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
Usando 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] O método Snap não é recomendado se você instalou o Docker via
apt-get, pois pode quebrar seu daemon Docker existente.Veja também: 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
Disponível no repositório extra e pode ser instalado via pacman:
pacman -S dive
Mac
Se você usa Homebrew:
brew install dive
Se você usa MacPorts:
sudo port install dive
Ou baixe a última compilação Darwin da página de releases.
Windows
Se você usa Chocolatey
choco install dive
Se você usa scoop
scoop install main/dive
Se você usa winget:
winget install --id wagoodman.dive
Ou baixe a última compilação Windows da página de releases.
Go tools Requer Go versão 1.10 ou superior.
go install github.com/wagoodman/dive@latest
Nota: instalando desta forma você não verá uma versão adequada ao executar dive -v.
Nix/NixOS
No NixOS:
nix-env -iA nixos.dive
Em não-NixOS (Linux, Mac)
nix-env -iA nixpkgs.dive
X-CMD
x-cmd é uma caixa de ferramentas para Posix Shell, oferecendo um gerenciador de pacotes leve construído usando shell e awk.
x env use dive
Docker
docker pull docker.io/wagoodman/dive
# ou alternativamente
docker pull ghcr.io/wagoodman/dive
Ao executar, você precisará incluir o arquivo de socket Docker:
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
docker.io/wagoodman/dive:latest <dive arguments...>
Docker para Windows (mostrando quebras de linha compatíveis com PowerShell; colapse em uma única linha para compatibilidade com Command Prompt)
docker run --rm -it `
-v /var/run/docker.sock:/var/run/docker.sock `
docker.io/wagoodman/dive:latest <dive arguments...>
Nota: dependendo da versão do docker que você está executando localmente, pode ser necessário especificar a versão da API do docker como uma variável de ambiente:
DOCKER_API_VERSION=1.37 dive ...
ou se você estiver executando com uma imagem 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...>
se você estiver usando um runtime alternativo (Colima etc), então pode ser necessário especificar o host docker como uma variável de ambiente para puxar imagens locais:
export DOCKER_HOST=$(docker context inspect -f '{{ .Endpoints.docker.Host }}')
Ao executar dive com a variável de ambiente CI=true, a interface do dive será ignorada e, em vez disso, analisará sua imagem docker, dando uma indicação de aprovação/reprovação através do código de retorno. Atualmente, há três métricas suportadas através de um arquivo .dive-ci que você pode colocar na raiz do seu repositório:
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
Você pode sobrescrever o caminho do config CI com a opção --ci-config.
Nenhuma configuração é necessária, no entanto, você pode criar um arquivo de configuração e sobrescrever valores:
# 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 procurará configurações nos seguintes locais:
$XDG_CONFIG_HOME/dive/*.yaml$XDG_CONFIG_DIRS/dive/*.yaml~/.config/dive/*.yaml~/.dive.yaml.yml pode ser usado no lugar de .yaml se desejado.
| Key Binding | Description |
|---|
| Ctrl + C or Q | Sair |
| Tab | Alternar entre as visualizações de camada e árvore de arquivos |
| Ctrl + F | Filtrar arquivos |
| ESC | Fechar filtro de arquivos |
| PageUp or U | Rolar uma página para cima |
| PageDown or D | Rolar uma página para baixo |
| Up or K | Mover uma linha para cima dentro de uma página |
| Down or J | Mover uma linha para baixo dentro de uma página |
| Ctrl + A | Visualização de camada: ver modificações agregadas da imagem |
| Ctrl + L | Visualização de camada: ver modificações da camada atual |
| Space | Visualização da árvore de arquivos: colapsar/expandir um diretório |
| Ctrl + Space | Visualização da árvore de arquivos: colapsar/expandir todos os diretórios |
| Ctrl + A | Visualização da árvore de arquivos: mostrar/esconder arquivos adicionados |
| Ctrl + R | Visualização da árvore de arquivos: mostrar/esconder arquivos removidos |
| Ctrl + M | Visualização da árvore de arquivos: mostrar/esconder arquivos modificados |
| Ctrl + U | Visualização da árvore de arquivos: mostrar/esconder arquivos não modificados |
| Ctrl + B | Visualização da árvore de arquivos: mostrar/esconder atributos de arquivos |
| PageUp or U | Visualização da árvore de arquivos: rolar uma página para cima |
| PageDown or D | Visualização da árvore de arquivos: rolar uma página para baixo |