Dans ce didacticiel, nous allons apprendre ce qu'est Container-diff, comment installer Container-diff dans diverses distributions Linux et enfin comment analyser et comparer des images de conteneurs à l'aide de Container-diff.
Présentation
J'ai une bonne nouvelle pour ceux qui créent des applications sur des conteneurs.
Imaginez ce scénario. Vous êtes un développeur de logiciels. Vous travaillez sur une application, sur une image de conteneur d'exécution qui est maintenue par quelqu'un d'autre.
Au milieu du développement, le créateur original de l'image de conteneur publie une nouvelle version de cette image de base avec des packages système mis à jour.
Vous téléchargez l'image de base mise à jour et continuez à reconstruire votre application dessus. Soudain, votre application a cessé de fonctionner.
Vous avez réussi à le faire fonctionner dans l'image précédente, mais votre application n'a pas fonctionné dans la dernière image de base.
Vous êtes également à peu près sûr que l'application fonctionnait bien sur la version précédente des packages système dans l'image de base, mais vous ne savez pas laquelle. C'est là que "Container-diff" vient en aide.
Qu'est-ce que Container-diff ?
Container-diff est un outil open source de Google qui vous aide à analyser et à comparer les images de conteneurs hébergées sur la plate-forme cloud de Google .
Container-diff, est utilisé pour suivre facilement les modifications apportées entre les deux images de base, afin que vous puissiez mieux comprendre ce qui a vraiment changé à l'intérieur des images.
Cela vous fera gagner beaucoup de temps pour trouver l'incompatibilité de la version du package, et vous pouvez décider de reconstruire l'application sur la dernière image de conteneur ou simplement de conserver l'ancienne version jusqu'à ce que vous trouviez une solution de contournement appropriée.
Cela vous permet également d'examiner facilement si votre application fonctionnera ou non sur les nouvelles versions d'une image de conteneur.
Container-diff analyse les éléments suivants dans les images de conteneur.
- Historique des images Docker
- Système de fichiers d'image,
- Taille de l'image,
- Forfaits Apt,
- Packages RPM,
- paquets pip,
- paquets npm.
Voyons maintenant comment installer Container-diff et comment l'utiliser pour comparer des images de conteneurs.
Installer Container-diff sous Linux
J'ai testé Container-diff sur un système Ubuntu. Cependant, cela devrait fonctionner sur Debian et d'autres variantes d'Ubuntu, ainsi que sur d'autres distributions Linux.
Tout d'abord, assurez-vous d'avoir installé Docker. Si vous ne l'avez pas déjà installé, consultez le lien suivant.
- Comment installer Docker dans Ubuntu
Une fois Docker installé, installez Container-diff sur votre système Linux à l'aide des commandes suivantes :
$ curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
$ sudo install container-diff-linux-amd64 /usr/local/bin/container-diff
Ou, si vous ne voulez pas utiliser sudo, exécutez :
$ curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
$ mkdir -p "$HOME/bin"
$ export PATH="$PATH:$HOME/bin"
$ install container-diff-linux-amd64 $HOME/bin/container-diff
Si vous êtes sur Arch Linux, vous pouvez installer Container-diff en utilisant la commande suivante :
$ sudo pacman -S container-diff
Analyser les images de conteneur
Commençons par analyser une image de conteneur, par exemple Debian 9, qui est stockée dans Google Container Registry. .
$ container-diff analyze gcr.io/google-appengine/debian9:latest
Exemple de résultat :
Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry Retrieving analyses -----Apt----- Packages found in gcr.io/google-appengine/debian9:latest: NAME VERSION SIZE -adduser 3.115 849K -apt 1.4.8 3.5M -base-files 9.9 deb9u2 333K -base-passwd 3.5.43 229K -bash 4.4-5 5.7M -bsdutils 1:2.29.2-1 238K -ca-certificates 20161130 nmu1 468K -coreutils 8.26-3 14.7M -dash 0.5.8-2.4 204K -debconf 1.5.61 558K -debian-archive-keyring 2017.5 118K -debianutils 4.8.1.1 213K -diffutils 1:3.5-3 1.3M -dpkg 1.18.24 6.6M -e2fslibs 1.43.4-2 449K -e2fsprogs 1.43.4-2 3.9M -findutils 4.6.0 git+20161106-2 1.8M -gcc-6-base 6.3.0-18 209K -gpgv 2.1.18-8~deb9u1 721K -grep 2.27-2 1.1M -gzip 1.6-5 b1 231K -hostname 3.18 b1 47K -init-system-helpers 1.48 131K -libacl1 2.2.52-3 b1 62K -libapt-pkg5.0 1.4.8 3M -libattr1 1:2.4.47-2 b2 42K -libaudit-common 1:2.6.7-2 30K -libaudit1 1:2.6.7-2 150K -libblkid1 2.29.2-1 367K -libbz2-1.0 1.0.6-8.1 96K -libc-bin 2.24-11 deb9u1 3.3M -libc6 2.24-11 deb9u1 10.4M -libcap-ng0 0.7.7-3 b1 43K -libcomerr2 1.43.4-2 83K -libdb5.3 5.3.28-12 deb9u1 1.8M -libdebconfclient0 0.227 67K -libfdisk1 2.29.2-1 469K -libgcc1 1:6.3.0-18 108K -libgcrypt20 1.7.6-2 deb9u2 1.2M -libgpg-error0 1.26-2 572K -liblz4-1 0.0~r131-2 b1 93K -liblzma5 5.2.2-1.2 b1 339K -libmount1 2.29.2-1 403K -libncursesw5 6.0 20161126-1+deb9u1 347K -libpam-modules 1.1.8-3.6 874K -libpam-modules-bin 1.1.8-3.6 220K -libpam-runtime 1.1.8-3.6 1016K -libpam0g 1.1.8-3.6 229K -libpcre3 2:8.39-3 668K -libselinux1 2.6-3 b3 209K -libsemanage-common 2.6-2 39K -libsemanage1 2.6-2 291K -libsepol1 2.6-2 653K -libsmartcols1 2.29.2-1 257K -libss2 1.43.4-2 95K -libssl1.1 1.1.0f-3 deb9u1 3.4M -libstdc++6 6.3.0-18 2M -libsystemd0 232-25 deb9u1 652K -libtinfo5 6.0 20161126-1+deb9u1 478K -libudev1 232-25 deb9u1 222K -libustr-1.0-1 1.0.4-6 258K -libuuid1 2.29.2-1 107K -login 1:4.4-4.1 2.7M -lsb-base 9.20161125 49K -mawk 1.3.3-17 b3 183K -mount 2.29.2-1 444K -multiarch-support 2.24-11 deb9u1 220K -ncurses-base 6.0 20161126-1+deb9u1 340K -ncurses-bin 6.0 20161126-1+deb9u1 536K -netbase 5.4 44K -openssl 1.1.0f-3 deb9u1 1.2M -passwd 1:4.4-4.1 2.4M -perl-base 5.24.1-3 deb9u2 7.4M -sed 4.4-1 799K -sensible-utils 0.0.9 110K -sysvinit-utils 2.88dsf-59.9 110K -tar 1.29b-1.1 2.7M -tzdata 2017c-0 deb9u1 2.9M -util-linux 2.29.2-1 3.5M -zlib1g 1:1.2.8.dfsg-5 156K
Comme vous pouvez le voir, Container-diff affiche l'analyse APT sans --type
drapeau spécifié.
La liste des analyseurs disponibles est ;
- --type=history [Historique]
- --type=file [Système de fichiers]
- --type=pip [Pip]
- --type=apt [Apt]
- --type=node [Nœud]
Vous pouvez exécuter plusieurs analyseurs à la fois comme ci-dessous.
$ container-diff analyze gcr.io/google-appengine/debian9:latest --type=history --type=apt --type=file
Comparer les images de conteneur à l'aide de Container-diff
Pour comparer deux images de conteneurs, utilisez la commande suivante :
$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738
Ici, je compare deux images de conteneur, la dernière image de build Debian 9 et une image Debian 9 construite le 18/10/2017.
Exemple de résultat :
Starting diff on images gcr.io/google-appengine/debian9:latest and gcr.io/google-appengine/debian9:2017-10-18-191738, using differs: [apt] Retrieving image gcr.io/google-appengine/debian9:2017-10-18-191738 from source Cloud Registry Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry Computing diffs -----Apt----- Packages found only in gcr.io/google-appengine/debian9:latest: None Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None Version differences: PACKAGE IMAGE1 (gcr.io/google-appengine/debian9:latest) IMAGE2 (gcr.io/google-appengine/debian9:2017-10-18-191738) -libssl1.1 1.1.0f-3 deb9u1, 3.4M 1.1.0f-3, 3.4M -openssl 1.1.0f-3 deb9u1, 1.2M 1.1.0f-3, 1.2M -tzdata 2017c-0 deb9u1, 2.9M 2017b-1, 2.9M
Comme vous pouvez le voir dans la sortie, trois packages ont été mis à jour dans la dernière version.
S'il n'y a pas de différences entre les deux images, vous verrez une sortie comme ci-dessous.
Computing diffs -----Apt----- Packages found only in gcr.io/google-appengine/debian9:latest: None Packages found only in gcr.io/google-appengine/debian9:2017-11-27-220229: None Version differences: None
Comme je l'ai déjà dit, par défaut, sans --type
flag spécifié, container-diff exécutera l'analyse du package Apt.
Nous pouvons exécuter plusieurs analyseurs à la fois, comme indiqué ci-dessous.
$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738 --type=history --type=apt --type=node
Ici, j'exécute trois analyseurs, à savoir l'historique , apt , et nœud .
Exemple de résultat :
Starting diff on images gcr.io/google-appengine/debian9:latest and gcr.io/google-appengine/debian9:2017-10-18-191738, using differs: [history apt node] Retrieving image gcr.io/google-appengine/debian9:2017-10-18-191738 from source Cloud Registry Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry Computing diffs -----Apt----- Packages found only in gcr.io/google-appengine/debian9:latest: None Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None Version differences: PACKAGE IMAGE1 (gcr.io/google-appengine/debian9:latest) IMAGE2 (gcr.io/google-appengine/debian9:2017-10-18-191738) -libssl1.1 1.1.0f-3 deb9u1, 3.4M 1.1.0f-3, 3.4M -openssl 1.1.0f-3 deb9u1, 1.2M 1.1.0f-3, 1.2M -tzdata 2017c-0 deb9u1, 2.9M 2017b-1, 2.9M -----History----- Docker history lines found only in gcr.io/google-appengine/debian9:latest: None Docker history lines found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None -----Node----- Packages found only in gcr.io/google-appengine/debian9:latest: None Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None Version differences: None
Vous pouvez également comparer l'image stockée localement avec l'image distante, comme indiqué ci-dessous.
$ container-diff diff daemon://modified_debian:latest remote://gcr.io/google-appengine/debian9:latest
Pour plus de détails, consultez les liens officiels de Container-diff ci-dessous.