
Un outil pour explorer chaque couche dans une image Docker
Un outil pour explorer une image Docker, le contenu des couches, et découvrir des moyens de réduire la taille de votre image Docker/OCI.

Pour analyser une image Docker, exécutez simplement dive avec un tag/id/digest d'image :
dive <votre-tag-image>
ou vous pouvez utiliser dive directement avec Docker :
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive"
dive <votre-tag-image>
# par exemple
dive nginx:latest
ou si vous voulez construire votre image puis passer directement à son analyse :
dive build -t <un-tag> .
Construction sur macOS (supportant uniquement le moteur de conteneur 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 <un-tag> .
De plus, vous pouvez exécuter ceci dans votre pipeline CI pour vous assurer de minimiser l'espace gaspillé (cela ignore l'interface utilisateur) :
CI=true dive <votre-image>

Ceci est de qualité bêta ! N'hésitez pas à soumettre un problème si vous voulez une nouvelle fonctionnalité ou trouvez un bug :)
Afficher le contenu de l'image Docker décomposé par couche
Lorsque vous sélectionnez une couche à gauche, le contenu de cette couche combiné avec toutes les couches précédentes est affiché à droite. De plus, vous pouvez explorer entièrement l'arborescence des fichiers avec les touches fléchées.
Indiquer ce qui a changé dans chaque couche
Les fichiers qui ont changé, été modifiés, ajoutés ou supprimés sont indiqués dans l'arborescence. Cela peut être ajusté pour afficher les modifications pour une couche spécifique, ou les modifications agrégées jusqu'à cette couche.
Estimer l'efficacité de l'image
Le volet en bas à gauche affiche les informations de base de la couche et une métrique expérimentale qui estimera la quantité d'espace gaspillé dans votre image. Cela peut provenir de la duplication de fichiers entre les couches, du déplacement de fichiers entre les couches, ou de la suppression incomplète de fichiers. Un pourcentage de score et l'espace total gaspillé sont fournis.
Cycles rapides de construction/analyse
Vous pouvez construire une image Docker et effectuer une analyse immédiate avec une seule commande :
dive build -t some-tag .
Vous devez simplement remplacer votre commande docker build par la même commande dive build.
Intégration CI
Analysez une image et obtenez un résultat de succès/échec basé sur l'efficacité de l'image et l'espace gaspillé. Il suffit de définir CI=true dans l'environnement lors de l'appel de toute commande dive valide.
Plusieurs sources d'images et moteurs de conteneurs pris en charge
Avec l'option --source, vous pouvez sélectionner d'où récupérer l'image du conteneur :
dive <votre-image> --source <source>
ou
dive <source>://<votre-image>
Avec les options source valides suivantes :
docker : moteur Docker (l'option par défaut)docker-archive : une archive Docker Tar depuis le disquepodman : moteur Podman (linux uniquement)Ubuntu/Debian
En utilisant les paquets 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
En utilisant 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] La méthode Snap n'est pas recommandée si vous avez installé Docker via
apt-get, car elle pourrait casser votre démon Docker existant.Voir aussi : 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
Disponible dans le dépôt extra et peut être installé via pacman :
pacman -S dive
Mac
Si vous utilisez Homebrew :
brew install dive
Si vous utilisez MacPorts :
sudo port install dive
Ou téléchargez la dernière version Darwin depuis la page des versions.
Windows
Si vous utilisez Chocolatey
choco install dive
Si vous utilisez scoop
scoop install main/dive
Si vous utilisez winget :
winget install --id wagoodman.dive
Ou téléchargez la dernière version Windows depuis la page des versions.
Outils Go Nécessite Go version 1.10 ou supérieure.
go install github.com/wagoodman/dive@latest
Note : en installant de cette façon, vous ne verrez pas une version correcte en exécutant dive -v.
Nix/NixOS
Sur NixOS :
nix-env -iA nixos.dive
Sur non-NixOS (Linux, Mac)
nix-env -iA nixpkgs.dive
X-CMD
x-cmd est une boîte à outils pour shell Posix, offrant un gestionnaire de paquets léger construit avec shell et awk.
x env use dive
Docker
docker pull docker.io/wagoodman/dive
# ou alternativement
docker pull ghcr.io/wagoodman/dive
Lors de l'exécution, vous devrez inclure le fichier de socket Docker :
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
docker.io/wagoodman/dive:latest <arguments dive...>
Docker pour Windows (affichage de sauts de ligne compatibles PowerShell ; réduire à une seule ligne pour la compatibilité avec l'invite de commande)
docker run --rm -it `
-v /var/run/docker.sock:/var/run/docker.sock `
docker.io/wagoodman/dive:latest <arguments dive...>
Remarque : selon la version de docker que vous exécutez localement, vous devrez peut-être spécifier la version de l'API docker comme variable d'environnement :
DOCKER_API_VERSION=1.37 dive ...
ou si vous exécutez avec une image 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 <arguments dive...>
si vous utilisez un runtime alternatif (Colima etc), vous devrez peut-être spécifier l'hôte docker comme variable d'environnement pour extraire les images locales :
export DOCKER_HOST=$(docker context inspect -f '{{ .Endpoints.docker.Host }}')
Lorsque vous exécutez dive avec la variable d'environnement CI=true, l'interface utilisateur de dive sera contournée et analysera votre image docker, donnant une indication de réussite/échec via le code de retour. Actuellement, trois métriques sont supportées via un fichier .dive-ci que vous pouvez placer à la racine de votre dépôt :
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
Vous pouvez remplacer le chemin de configuration CI avec l'option --ci-config.
| Raccourci clavier | Description |
|---|---|
| Ctrl + C ou Q | Quitter |
| Tab | Basculer entre les vues des couches et de l'arborescence |
| Ctrl + F | Filtrer les fichiers |
| ESC | Fermer le filtre des fichiers |
| PageUp ou U | Défiler d'une page vers le haut |
| PageDown ou D | Défiler d'une page vers le bas |
| Up ou K | Monter d'une ligne dans une page |
| Down ou J | Descendre d'une ligne dans une page |
| Ctrl + A | Vue des couches : voir les modifications d'image agrégées |
| Ctrl + L | Vue des couches : voir les modifications de la couche actuelle |
| Space | Vue de l'arborescence : réduire/développer un répertoire |
| Ctrl + Space | Vue de l'arborescence : réduire/développer tous les répertoires |
| Ctrl + A | Vue de l'arborescence : afficher/masquer les fichiers ajoutés |
| Ctrl + R | Vue de l'arborescence : afficher/masquer les fichiers supprimés |
| Ctrl + M | Vue de l'arborescence : afficher/masquer les fichiers modifiés |
| Ctrl + U | Vue de l'arborescence : afficher/masquer les fichiers non modifiés |
| Ctrl + B | Vue de l'arborescence : afficher/masquer les attributs de fichier |
| PageUp ou U | Vue de l'arborescence : défiler d'une page vers le haut |
| PageDown ou D | Vue de l'arborescence : défiler d'une page vers le bas |
Aucune configuration n'est nécessaire, cependant, vous pouvez créer un fichier de configuration et surcharger les valeurs :
# 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 recherchera les configurations dans les emplacements suivants :
$XDG_CONFIG_HOME/dive/*.yaml$XDG_CONFIG_DIRS/dive/*.yaml~/.config/dive/*.yaml~/.dive.yaml.yml peut être utilisé à la place de .yaml si souhaité.