Outil d’exploration des images Docker et du contenu des couches : « Dive »
(github.com/wagoodman)- Dive est un outil qui permet d’explorer les couches et le contenu des fichiers des images Docker/OCI, et de repérer les possibilités de réduction de la taille des images
- Il est possible d’exécuter
dive <your-image-tag>avec un tag, un ID ou un digest d’image, ou d’utiliserdive build -t <some-tag>.pour effectuer l’analyse juste après le build en une seule commande - Lorsqu’on sélectionne une couche, l’outil affiche l’arborescence de fichiers résultant de la fusion de cette couche avec les couches précédentes, ce qui permet de voir les fichiers ajoutés, modifiés, supprimés ainsi que les changements cumulés
- Son indicateur expérimental d’image efficiency estime, sous forme de score et de volume total, l’espace gaspillé dû aux fichiers dupliqués, aux déplacements de fichiers entre couches et aux fichiers non complètement supprimés
- Avec
CI=true, il est possible d’ignorer l’interface et d’obtenir un résultat de réussite/échec selon des seuils d’efficacité de l’image et d’espace gaspillé, afin d’automatiser la gestion de la taille des images dans un pipeline CI
Ce que fait Dive
- Dive est un outil d’exploration des images Docker, du contenu des couches et des moyens de réduire la taille des images Docker/OCI
- L’exécution de base consiste à lui passer un tag, un ID ou un digest d’image
dive <your-image-tag>
- Il peut aussi être exécuté dans un conteneur Docker, auquel cas il faut monter le socket Docker
- utilisation de l’image
docker.io/wagoodman/dive - l’image
nginx:latestest donnée comme exemple cible
- utilisation de l’image
- Pour analyser une image immédiatement après sa construction, on peut utiliser la commande
dive buildau lieu dedocker build, avec la même formedive build -t <some-tag> .
- Sur macOS, l’analyse de build exécutée en conteneur ne prend en charge que le moteur de conteneurs Docker
- Le projet est actuellement en beta quality, et les demandes de nouvelles fonctionnalités ou les bugs peuvent être signalés via des issues
Exploration des couches et des changements de fichiers
- Lorsqu’on sélectionne une couche à gauche, l’arborescence de fichiers combinant cette couche et les couches précédentes s’affiche à droite
- Il est possible de parcourir l’arborescence avec les touches fléchées
- L’état des fichiers modifiés dans chaque couche est affiché dans l’arborescence
- modifié
- altéré
- ajouté
- supprimé
- L’affichage des changements peut être ajusté pour se baser soit sur une couche donnée, soit sur les changements cumulés jusqu’à cette couche
Efficacité de l’image et estimation de l’espace gaspillé
- Le panneau en bas à gauche affiche les informations de base sur les couches ainsi que l’indicateur expérimental d’image efficiency
- Cet indicateur estime l’espace gaspillé dans l’image
- duplication de fichiers entre les couches
- déplacement de fichiers entre les couches
- fichiers non complètement supprimés
- Le résultat est fourni sous la forme d’un score en pourcentage et d’un volume total d’espace occupé par des fichiers inutiles
Utilisation dans CI comme critère de réussite/échec
- En l’exécutant avec la variable d’environnement
CI=true, Dive ignore l’interface, analyse l’image puis renvoie un code de retour indiquant le résultat pass/fail - Le fichier
.dive-cià la racine du dépôt permet de définir 3 critèreslowestEfficiency: échec si l’efficacité est inférieure au pourcentage indiquéhighestWastedBytes: échec si l’espace gaspillé atteint ou dépasse le volume indiquéhighestUserWastedPercent: échec si le pourcentage de gaspillage des couches utilisateur atteint ou dépasse le pourcentage indiqué
- Dans le calcul de
highestUserWastedPercent, la base image layer n’est pas incluse dans la taille totale de l’image - Le chemin du fichier de configuration CI peut être remplacé via l’option
--ci-config
Sources d’images et moteur de conteneurs
- L’option
--sourcepermet de choisir d’où récupérer l’image de conteneurdive <your-image> --source <source>dive <source>://<your-image>
- Les options
sourceprises en charge sont les suivantesdocker: moteur Docker, valeur par défautdocker-archive: archive Tar Docker sur disquepodman: moteur Podman, pris en charge uniquement sous Linux
Installation et modes d’exécution
- Sous Ubuntu/Debian, l’installation peut se faire via un paquet
.debou Snap - La méthode Snap n’est pas recommandée si Docker a été installé avec
apt-get, car elle peut perturber le daemon Docker existant - Sous RHEL/Centos, l’installation peut se faire via un paquet
.rpm - Sous Arch Linux, le paquet est disponible dans le extra repository et peut être installé avec pacman
- Sous macOS, l’installation est possible via Homebrew, MacPorts ou le build Darwin disponible sur la releases page
- Sous Windows, l’installation est possible via Chocolatey, scoop,
wingetou le build Windows disponible sur la releases page - Pour une installation avec l’outil Go, Go 1.10 ou supérieur est requis
go install github.com/wagoodman/dive@latest- avec cette méthode,
dive -vn’affiche pas la bonne version
- Des méthodes d’installation pour Nix/NixOS et x-cmd sont également proposées
- Lors de l’exécution via une image Docker, il faut inclure le fichier du socket Docker
-v /var/run/docker.sock:/var/run/docker.sock
- Selon la version locale de Docker, une variable d’environnement comme
DOCKER_API_VERSION=1.37peut être nécessaire - Si vous utilisez un runtime alternatif comme Colima, il peut être nécessaire de définir la variable d’environnement
DOCKER_HOSTpour récupérer les images locales
Commandes et configuration de l’interface
- Les principaux raccourcis clavier permettent de naviguer entre la vue des couches et l’arborescence de fichiers, ainsi que de filtrer et d’activer ou désactiver certains affichages
Ctrl+CouQ: quitterTab: basculer entre la vue des couches et l’arborescence de fichiersCtrl+F: filtre de fichiersCtrl+A: dans la vue des couches, basculer l’affichage des changements cumulés de l’image ; dans l’arborescence, afficher ou masquer les fichiers ajoutésCtrl+L: afficher les changements de la couche actuelleCtrl+R,Ctrl+M,Ctrl+U: afficher ou masquer les fichiers supprimés, modifiés et inchangésCtrl+B: afficher ou masquer les attributs des fichiers
- Aucune configuration séparée n’est nécessaire, mais il est possible de surcharger les valeurs via un fichier de configuration YAML
- Les éléments configurables incluent le moteur de conteneurs, l’ignorance des erreurs d’analyse des archives d’images, les logs, les raccourcis clavier, l’affichage des diff, la largeur de l’arborescence, l’état replié par défaut des répertoires et l’affichage des changements cumulés des couches
- Les emplacements de recherche des fichiers de configuration sont les suivants
$XDG_CONFIG_HOME/dive/*.yaml$XDG_CONFIG_DIRS/dive/*.yaml~/.config/dive/*.yaml~/.dive.yaml
- L’extension
.ymlpeut aussi être utilisée à la place de.yaml
1 commentaires
Commentaires sur Hacker News
crane est excellent pour manipuler des images et des couches, et sa bibliothèque sous-jacente go-containerregistry est elle aussi très bonne
On peut ajouter une nouvelle couche à une image existante ou modifier des métadonnées (variables d’environnement, labels, entrypoint, etc.), et aussi « aplatir » une image à plusieurs couches en une seule couche
Il est également possible de faire un « rebase », c’est-à-dire réappliquer les changements sur une nouvelle image de base, le tout directement depuis le registre sans avoir besoin de Docker
https://github.com/google/go-containerregistry/blob/main/cmd...
cranedans le dépôt NixCela permet de gérer avec Nix non seulement les dépendances de build (par ex. Go), mais aussi les outils de packaging et de déploiement (par ex. gnu tar, crane)
dive m’a été vraiment utile pour comprendre comment fonctionnent les images Docker et comment écrire un Dockerfile efficace
Lire la documentation est important, mais voir directement comment la structure des couches change après avoir modifié le Dockerfile a été décisif pour ma compréhension
Dive est formidable. Ce genre d’outil est important pour apprendre exactement ce que je construis et déploie, et pour en être certain
Dredge est aussi un outil qui vaut le détour, que j’utilise pour comparer les différences entre couches
https://github.com/mthalman/dredge/blob/main/docs/commands/i...
https://blog.haschek.at/2019/the-curious-case-of-the-RasPi-i...
C’est peut-être une question idiote, mais je me demande pourquoi la plupart des outils de conteneurs et d’infrastructure sont écrits en Go
Je pense à Docker, Podman, nerdctl, Terraform et Kubernetes, et j’aimerais savoir si Go apporte des avantages particulièrement nets pour ce type d’outils
La raison principale de la réécriture en Go était de profiter de la popularité croissante de Go à l’époque (2012). J’y étais
La différence saute aux yeux si on imagine Docker et Kubernetes écrits dans d’autres langages populaires
La seule alternative moderne vraiment mature qui me vient à l’esprit est Rust
Le fait qu’il y ait beaucoup d’ingénieurs Go dans les équipes internes vient de la même raison
Il y a aussi un effet d’écosystème : on peut réutiliser directement des paquets d’autres implémentations dans certaines parties du code
J’aime Dive et je le sors de ma boîte à outils plusieurs fois par mois
Je me demande simplement s’il existe un moyen d’afficher directement le contenu du fichier sélectionné. Souvent, après avoir vérifié qu’un fichier existe dans une couche, j’aimerais en inspecter le contenu ; aujourd’hui je lance généralement le conteneur pour utiliser
cat, ou j’extrais le contenu puis je vais chercher dans les dossierscatEn étendant plusieurs conteneurs Docker publics, Dive m’a sauvé plus d’une fois pour disséquer ce qu’ils faisaient à l’intérieur
C’est vraiment un logiciel de niveau A+
Il existe d’autres excellents outils TUI de terminal comme dive. Je pense à lazydocker et dry
Il y en a aussi quelques-uns dans la catégorie Docker
[0] https://terminaltrove.com/
Je viens de vérifier : on peut voir les couches, mais il n’affiche que les commandes de chaque couche
Dive est un outil incroyable dans l’univers des conteneurs/Docker. Il rend le débogage de ce qu’il y a réellement dans un conteneur bien plus facile
Quand nous avons lancé Depot [0], on nous demandait souvent comment réduire la taille des images et accélérer les builds, donc j’ai résumé dans un court billet [1] comment résoudre ce problème avec Dive. C’est peut-être un peu daté maintenant, mais ça peut encore aider quelqu’un
Inspirés par Dive, nous avons aussi rendu beaucoup plus visible ce qu’il y a réellement dans le contexte de build à chaque build, et nous l’avons lancé comme fonctionnalité Depot il y a quelques semaines
[0] https://depot.dev
[1] https://depot.dev/blog/reducing-image-size-with-dive
[2] https://depot.dev/blog/build-context
Au-delà de son utilité évidente, Dive a aussi un avantage sous-estimé. Son auteur est un excellent développeur et quelqu’un avec qui il est vraiment agréable de travailler
L’outil container-diff de Google est lui aussi très utile
Je m’en sers pour voir ce que va réellement faire au système un script arbitraire qu’on recommande d’exécuter en le passant dans un pipe bash
C’est un moyen pratique d’exécuter des tests d’intégration sur une application ou une image de conteneur
C’est dommage que beaucoup de ces projets open source de Google semblent avoir besoin d’attention, puisque nombre de leurs mainteneurs d’origine sont partis. J’essaie d’envoyer des PR quand je peux, et de fermer parfois quelques issues. Cet outil de test en particulier est extrêmement précieux pour garder la tête froide quand on gère en interne un grand nombre d’images de base à maintenir