
Uno strumento per esplorare ogni layer in un'immagine Docker
Uno strumento per esplorare un'immagine Docker, il contenuto dei layer e scoprire modi per ridurre le dimensioni della tua immagine Docker/OCI.

Per analizzare un'immagine Docker, esegui semplicemente dive con un tag/id/digest dell'immagine:
dive <your-image-tag>
oppure puoi usare direttamente dive con Docker:
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive"
dive <your-image-tag>
# per esempio
dive nginx:latest
oppure se vuoi creare la tua immagine e poi passare direttamente all'analisi:
dive build -t <some-tag> .
Compilazione su macOS (supporta solo il motore contenitori 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> .
Inoltre, puoi eseguirlo nella tua pipeline CI per assicurarti di mantenere al minimo lo spazio sprecato (salta l'interfaccia):
CI=true dive <your-image>

Questa è una versione beta! Sentiti libero di aprire un problema se vuoi una nuova funzionalità o trovi un bug :)
Mostra il contenuto dell'immagine Docker suddiviso per layer
Quando selezioni un layer a sinistra, viene mostrato il contenuto di quel layer combinato con tutti i layer precedenti a destra. Inoltre, puoi esplorare completamente l'albero dei file con i tasti freccia.
Indica cosa è cambiato in ogni layer
I file che sono stati modificati, aggiunti o rimossi vengono indicati nell'albero dei file. Questo può essere regolato per mostrare le modifiche per un layer specifico o le modifiche aggregate fino a questo layer.
Stima dell'"efficienza dell'immagine"
Il pannello in basso a sinistra mostra le informazioni di base del layer e una metrica sperimentale che stima quanto spazio sprecato contiene la tua immagine. Questo potrebbe derivare dalla duplicazione di file tra i layer, dallo spostamento di file tra i layer o dalla rimozione non completa dei file. Vengono forniti sia una percentuale "punteggio" che lo spazio totale sprecato.
Cicli rapidi di build/analisi
Puoi creare un'immagine Docker ed eseguire un'analisi immediata con un solo comando:
dive build -t some-tag .
Devi solo sostituire il tuo comando docker build con lo stesso comando dive build.
Integrazione CI
Analizza un'immagine e ottieni un risultato di superato/non superato basato sull'efficienza dell'immagine e sullo spazio sprecato. Basta impostare CI=true nell'ambiente quando si invoca un comando dive valido.
Supporto di più sorgenti di immagini e motori contenitori
Con l'opzione --source, puoi selezionare da dove recuperare l'immagine del contenitore:
dive <your-image> --source <source>
oppure
dive <source>://<your-image>
Con le opzioni source valide:
docker: motore Docker (opzione predefinita)docker-archive: un archivio Tar Docker dal discopodman: motore Podman (solo Linux)Ubuntu/Debian
Usando i 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
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] Il metodo Snap non è consigliato se hai installato Docker tramite
apt-get, poiché potrebbe rompere il demone Docker esistente.Vedi anche: 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
Disponibile nel repository extra e può essere installato tramite pacman:
pacman -S dive
Mac
Se usi Homebrew:
brew install dive
Se usi MacPorts:
sudo port install dive
Oppure scarica l'ultima build Darwin dalla pagina delle release.
Windows
Se usi Chocolatey
choco install dive
Se usi scoop
scoop install main/dive
Se usi winget:
winget install --id wagoodman.dive
Oppure scarica l'ultima build Windows dalla pagina delle release.
Strumenti Go Richiede la versione 1.10 o successiva di Go.
go install github.com/wagoodman/dive@latest
Nota: installando in questo modo non vedrai una versione corretta quando esegui dive -v.
Nix/NixOS
Su NixOS:
nix-env -iA nixos.dive
Su non-NixOS (Linux, Mac)
nix-env -iA nixpkgs.dive
X-CMD
x-cmd è una toolbox per Posix Shell che offre un gestore di pacchetti leggero costruito utilizzando shell e awk.
x env use dive
Docker
docker pull docker.io/wagoodman/dive
# oppure
docker pull ghcr.io/wagoodman/dive
Durante l'esecuzione dovrai includere il file del socket Docker:
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
docker.io/wagoodman/dive:latest <dive arguments...>
Docker per Windows (mostra interruzioni di riga compatibili con PowerShell; comprimi in una singola riga per la compatibilità con il prompt dei comandi)
docker run --rm -it `
-v /var/run/docker.sock:/var/run/docker.sock `
docker.io/wagoodman/dive:latest <dive arguments...>
Nota: a seconda della versione di Docker che stai utilizzando localmente, potrebbe essere necessario specificare la versione dell'API Docker come variabile d'ambiente:
DOCKER_API_VERSION=1.37 dive ...
oppure se stai eseguendo con un'immagine 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 stai utilizzando un runtime alternativo (Colima, ecc.) potrebbe essere necessario specificare l'host Docker come variabile d'ambiente per poter estrarre immagini locali:
export DOCKER_HOST=$(docker context inspect -f '{{ .Endpoints.docker.Host }}')
Quando si esegue dive con la variabile d'ambiente CI=true, l'interfaccia utente di dive viene bypassata e analizzerà invece la tua immagine Docker, fornendo un indicazione di superato/non superato tramite codice di uscita. Attualmente sono supportate tre metriche tramite un file .dive-ci che puoi mettere nella radice del tuo repository:
rules:
# Se l'efficienza è misurata al di sotto di X%, segna come fallito.
# Espresso come rapporto tra 0 e 1.
lowestEfficiency: 0.95
# Se la quantità di spazio sprecato è almeno X o maggiore di X, segna come fallito.
# Espresso in B, KB, MB e GB.
highestWastedBytes: 20MB
# Se la quantità di spazio sprecato costituisce X% o più dell'immagine, segna come fallito.
# Nota: il layer dell'immagine base NON è incluso nella dimensione totale dell'immagine.
# Espresso come rapporto tra 0 e 1; fallisce se la soglia viene raggiunta o superata.
highestUserWastedPercent: 0.20
Puoi sovrascrivere il percorso di configurazione CI con l'opzione --ci-config.
Nessuna configurazione è necessaria, tuttavia puoi creare un file di configurazione e sovrascrivere i valori:
# le opzioni supportate sono "docker" e "podman"
container-engine: docker
# continua con l'analisi anche se ci sono errori nell'analisi dell'archivio immagine
ignore-errors: false
log:
enabled: true
path: ./dive.log
level: info
# Nota: puoi specificare più associazioni separando i valori con una virgola.
# Nota: i suggerimenti dell'interfaccia derivano dalla prima associazione
keybinding:
# Associazione globali
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
# Associazione specifiche per la vista layer
compare-all: ctrl+a
compare-layer: ctrl+l
# Associazione specifiche per la vista file
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:
# Puoi cambiare i file predefiniti mostrati nell'albero dei file (riquadro destro). Tutti i tipi di diff sono mostrati per impostazione predefinita.
hide:
- added
- removed
- modified
- unmodified
filetree:
# Lo stato di compressione predefinito delle directory
collapse-dir: false
# La percentuale di larghezza dello schermo che l'albero dei file dovrebbe occupare (deve essere >0 e <1)
pane-width: 0.5
# Mostra gli attributi del file accanto all'albero
show-attributes: true
layer:
# Abilita la visualizzazione di tutte le modifiche da questo layer e da ogni layer precedente
show-aggregated-changes: false
dive cercherà i file di configurazione nelle seguenti posizioni:
$XDG_CONFIG_HOME/dive/*.yaml$XDG_CONFIG_DIRS/dive/*.yaml~/.config/dive/*.yaml~/.dive.yaml.yml può essere utilizzato al posto di .yaml se desiderato.
| Tasto | Descrizione |
|---|
| Ctrl + C o Q | Esci |
| Tab | Passa tra le viste layer e albero dei file |
| Ctrl + F | Filtra i file |
| ESC | Chiudi filtro file |
| PageUp o U | Scorri su di una pagina |
| PageDown o D | Scorri giù di una pagina |
| Su o K | Sposta su di una riga all'interno di una pagina |
| Giù o J | Sposta giù di una riga all'interno di una pagina |
| Ctrl + A | Vista layer: vedi le modifiche aggregate dell'immagine |
| Ctrl + L | Vista layer: vedi le modifiche del layer corrente |
| Spazio | Vista albero file: comprimi/espandi una directory |
| Ctrl + Spazio | Vista albero file: comprimi/espandi tutte le directory |
| Ctrl + A | Vista albero file: mostra/nascondi file aggiunti |
| Ctrl + R | Vista albero file: mostra/nascondi file rimossi |
| Ctrl + M | Vista albero file: mostra/nascondi file modificati |
| Ctrl + U | Vista albero file: mostra/nascondi file non modificati |
| Ctrl + B | Vista albero file: mostra/nascondi attributi file |
| PageUp o U | Vista albero file: scorri su di una pagina |
| PageDown o D | Vista albero file: scorri giù di una pagina |