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

Pour analyser une image Docker, il suffit d'exécuter dive avec un tag/id/digest d'image :
dive <your-image-tag>
ou vous pouvez plonger directement avec 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 si vous souhaitez construire votre image, passez directement à son analyse :
dive build -t <some-tag> .
Compilation sur macOS (prenant en charge 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 <some-tag> .
De plus, vous pouvez exécuter ceci dans votre pipeline CI pour vous assurer de réduire au minimum l'espace gaspillé (cela ignore l'interface utilisateur) :
CI=true dive <your-image>

Ceci est de qualité bêta ! N'hésitez pas à soumettre un ticket si vous souhaitez une nouvelle fonctionnalité ou si vous trouvez un bug :)
Afficher le contenu d'une image Docker décomposé par couche
Lorsque vous sélectionnez une couche à gauche, le contenu de cette couche combiné à toutes les couches précédentes s'affiche à droite. Vous pouvez également 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 été modifiés, ajoutés ou supprimés sont indiqués dans l'arborescence des fichiers. Cela peut être ajusté pour afficher les changements d'une couche spécifique, ou les changements agrégés jusqu'à cette couche.
Estimer l'« efficacité de l'image »
Le panneau inférieur gauche affiche les informations de base sur les couches ainsi qu'une métrique expérimentale qui estime l'espace gaspillé contenu dans votre image. Cela peut provenir de la duplication de fichiers entre les couches, du déplacement de fichiers entre les couches, ou de fichiers qui ne sont pas entièrement supprimés. Un « score » en pourcentage ainsi que l'espace total gaspillé sont fournis.
Cycles de build/analyse rapides
Vous pouvez construire une image Docker et effectuer une analyse immédiate avec une seule commande :
dive build -t some-tag .
Il vous suffit de remplacer votre commande docker build par la même commande dive build.
Intégration CI
Analysez une image et obtenez un résultat de réussite/échec basé sur l'efficacité de l'image et l'espace gaspillé. Définissez simplement CI=true dans l'environnement lors de l'invocation de toute commande dive valide.
Sources d'images et moteurs de conteneurs multiples pris en charge
Avec l'option --source, vous pouvez sélectionner la source à partir de laquelle récupérer l'image de conteneur :
dive <your-image> --source <source>
ou préfixez l'image avec un schéma <source>:// :
dive <source>://<your-image>
Les sources basées sur des fichiers prennent également la forme <source>:<path> utilisée par les autres outils anchore (par exemple dive oci-dir:./layout).
Pour toute autre source, un simple deux-points est interprété comme un nom d'image et un tag, donc dive docker:dind analyse l'image
docker:dind.
| Source | Lit l'image depuis |
|---|---|
docker | le moteur Docker (par défaut). Les images absentes localement sont récupérées via l'API docker, avec les identifiants de votre configuration docker. DOCKER_HOST, DOCKER_CONTEXT et le contexte docker actuel sont pris en compte |
podman | Podman. Sous linux, le store local est lu directement (aucun socket nécessaire, voir containers-storage, et un nom court comme myapp trouve aussi le localhost/myapp de podman), avec repli sur le socket podman. Sous macOS, le socket API de la machine podman en cours d'exécution est utilisé (trouvé via podman machine inspect) ; CONTAINER_HOST=unix://... le remplace, les connexions ssh sont refusées |
docker-archive | une archive tar docker save sur disque, ou une archive OCI (docker-tar est un alias) |
oci-archive | une archive tar de layout d'image OCI sur disque |
oci-dir | un répertoire de layout d'image OCI sur disque |
registry | un registre, sans moteur de conteneurs (identifiants de votre configuration docker). Les registres sur des adresses IP privées sont refusés, car ils seraient joints en http simple |
containerd | le démon containerd (CONTAINERD_NAMESPACE sélectionne l'espace de noms) |
containers-storage | le store local podman/buildah (linux uniquement, voir ci-dessous) |
auto | le détecter : d'abord les fichiers sur disque, puis docker, podman, containerd et containers-storage, puis un pull depuis un registre. La source choisie est indiquée, car une image qu'aucun moteur local ne possède provient discrètement d'un registre (Docker Hub pour un nom court). Valide uniquement pour --source, pas comme schéma |
Pour une image multi-plateforme, --platform choisit la variante à analyser (par exemple --platform linux/arm64). Une archive tar docker save
ne contient qu'une seule plateforme, dive le signale lorsqu'elle ne correspond pas.
La prise en charge de containers-storage n'est compilée qu'avec le tag de build containers_image_openpgp, que possèdent les builds de
release linux (et l'image docker). Sans lui, la source indique qu'elle n'est pas disponible. Pour le compiler
vous-même : go build -tags containers_image_openpgp,exclude_graphdriver_btrfs ./cmd/dive.
Export JSON
--json <path> ignore l'interface et écrit l'analyse dans un fichier. L'id de chaque couche est le diff ID de la couche (la même valeur que digestId).
Ubuntu/Debian
Via les 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
Utilisation de 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