In diesem Tutorial lernen wir, was Container-diff ist, wie Container-diff in verschiedenen Linux-Distributionen installiert wird und schließlich, wie Container-Images mit Container-diff analysiert und verglichen werden.
Einführung
Ich habe eine gute Nachricht für diejenigen, die Anwendungen auf Containern erstellen.
Stellen Sie sich dieses Szenario vor. Sie sind Softwareentwickler. Sie arbeiten an einer Anwendung, an einem Laufzeit-Container-Image, das von jemand anderem verwaltet wird.
Mitten in der Entwicklung veröffentlicht der ursprüngliche Ersteller des Container-Images eine neue Version dieses Basis-Images mit aktualisierten Systempaketen.
Sie laden das aktualisierte Basisimage herunter und bauen Ihre Anwendung darauf weiter neu auf. Plötzlich funktionierte Ihre Anwendung nicht mehr.
Sie haben es im vorherigen Image erfolgreich zum Laufen gebracht, aber Ihre Anwendung hat im neuesten Basisimage nicht funktioniert.
Sie sind sich auch ziemlich sicher, dass die Anwendung auf der vorherigen Version der Systempakete im Basisimage gut funktioniert hat, aber Sie haben keine Ahnung, welche. Hier ist "Container-Diff" kommt Hilfe.
Was ist Container-Diff?
Container-diff ist ein Open-Source-Tool von Google das Ihnen hilft, Container-Images zu analysieren und zu vergleichen, die auf der Google Cloud-Plattform gehostet werden .
Container-Diff wird verwendet, um auf einfache Weise nachzuverfolgen, welche Änderungen zwischen den beiden Basis-Images vorgenommen wurden, sodass Sie besser verstehen können, was sich wirklich in den Images geändert hat.
Dadurch sparen Sie viel Zeit, um die Inkompatibilität der Paketversion zu finden, und Sie können entscheiden, ob Sie die Anwendung auf dem neuesten Container-Image neu erstellen oder einfach bei der alten Version bleiben, bis Sie eine geeignete Problemumgehung gefunden haben.
Es hilft Ihnen auch, einfach zu prüfen, ob Ihre Anwendung auf den neuen Builds eines Container-Images funktioniert oder nicht.
Container-diff analysiert Folgendes in Container-Images.
- Verlauf von Docker-Images
- Image-Dateisystem,
- Bildgröße,
- Apt-Pakete,
- RPM-Pakete,
- PIP-Pakete,
- npm-Pakete.
Sehen wir uns nun an, wie Container-diff installiert und zum Vergleichen von Container-Images verwendet wird.
Container-diff unter Linux installieren
Ich habe Container-diff auf einem Ubuntu-System getestet. Es sollte jedoch auf Debian und anderen Ubuntu-Varianten und auch anderen Linux-Distributionen funktionieren.
Stellen Sie zunächst sicher, dass Sie Docker installiert haben. Wenn Sie es noch nicht installiert haben, verwenden Sie den folgenden Link.
- So installieren Sie Docker in Ubuntu
Sobald Docker installiert ist, installieren Sie Container-diff auf Ihrem Linux-System mit den folgenden Befehlen:
$ curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
$ sudo install container-diff-linux-amd64 /usr/local/bin/container-diff
Oder, wenn Sie sudo nicht verwenden möchten, führen Sie Folgendes aus:
$ 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
Wenn Sie Arch Linux verwenden, können Sie Container-diff mit dem folgenden Befehl installieren:
$ sudo pacman -S container-diff
Container-Images analysieren
Lassen Sie uns zunächst ein Container-Image analysieren, beispielsweise Debian 9, das in Google Container Registry gespeichert ist .
$ container-diff analyze gcr.io/google-appengine/debian9:latest
Beispielausgabe:
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
Wie Sie sehen, zeigt Container-diff die APT-Analyse ohne --type
an Flag angegeben.
Die Liste der verfügbaren Analysatoren ist:
- --type=history [Verlauf]
- --type=file [Dateisystem]
- --type=pip [Pip]
- --type=apt [Apt]
- --type=node [Knoten]
Sie können mehrere Analysatoren gleichzeitig wie unten ausführen.
$ container-diff analyze gcr.io/google-appengine/debian9:latest --type=history --type=apt --type=file
Container-Images mit Container-Diff vergleichen
Um zwei Container-Images zu vergleichen, verwenden Sie den folgenden Befehl:
$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738
Hier vergleiche ich zwei Container-Images, das neueste Debian 9-Build-Image und ein Debian 9-Image, das am 18.10.2017 erstellt wurde.
Beispielausgabe:
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
Wie Sie in der Ausgabe sehen können, wurden im neuesten Build drei Pakete aktualisiert.
Wenn es keine Unterschiede zwischen den beiden Bildern gibt, sehen Sie eine Ausgabe wie unten.
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
Wie ich schon sagte, standardmäßig ohne --type
Flag angegeben, container-diff führt die Apt-Paketanalyse aus.
Wir können mehrere Analysatoren gleichzeitig ausführen, wie unten gezeigt.
$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738 --type=history --type=apt --type=node
Hier führe ich drei Analysatoren aus, nämlich Verlauf , passend und Knoten .
Beispielausgabe:
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
Sie können das lokal gespeicherte Image auch wie unten gezeigt mit dem entfernten Image vergleichen.
$ container-diff diff daemon://modified_debian:latest remote://gcr.io/google-appengine/debian9:latest
Weitere Einzelheiten finden Sie unter den unten angegebenen offiziellen Container-Diff-Links.