2014-01-18 5 views
28

Ich habe eine Dockerfile mit einer Folge von RUN-Anweisungen, die "apt-get install" s ausführen; beispielsweise ein paar Zeilen:docker: wie man die Diffs zwischen 2 Bildern zeigt

RUN apt-get install -y tree 
RUN apt-get install -y git 

Nach „Docker build“ ausgeführt zu haben, wenn ich dann „-a Docker Bilder“ ausführen, sehe ich die Auflistung aller Basis-Kind-Kind -... Bilder, die während des Builds erstellt wurden.

Ich würde gerne eine Liste aller Pakete sehen, die installiert wurden, wenn die Zeile "apt-get install -y git" ausgeführt wurde (einschließlich der abhängigen Pakete, die möglicherweise installiert wurden, neben den Git-Paketen)).

Hinweis: Ich glaube, dass der Befehl "docker diff" die Diffs zwischen einem Container und dem Bild zeigt, von dem aus er gestartet wurde. Stattdessen möchte ich die Unterschiede zwischen 2 Bildern (der gleichen Linie): die "Baum" und "Git" Bild-IDs. Ist das möglich?

Danke.

Antwort

8

Jede RUN-Anweisung erstellt einen neuen Container und Sie können überprüfen, was ein Container geändert hat, indem Sie docker diff <container> verwenden.

Führen Sie also nach dem Erstellen Ihrer Dockerdatei docker ps -a aus, um eine Liste der Container zu erhalten, die die Builddatei erstellt hat. Es sollte etwas wie folgt aussehen:

CONTAINER ID IMAGE  COMMAND    CREATED  STATUS ... 
53d7dadafee7 f71e394eb0fc /bin/sh -c apt-get i 7 minutes ago Exit 0 ... 
... 

Jetzt können Sie tun docker diff 53d7dadafee7 zu sehen, was geändert wurde.

+3

Danke, das funktioniert, obwohl ich einen Container verwenden muss und es ist nicht ideal: Ich kann die Option -rm nicht in meinen Builds verwenden oder wenn zu einem späteren Zeitpunkt ich die Container aufzuräumen, dann ist die Info verloren. Es wäre einfach großartig, in der Lage zu sein, 2 verwandte Bilder zu differieren: "docker diff base_image base_grandchild" –

10

Ich nehme an, Sie könnten beide Bilder Dateisysteme tarballs über docker export CONTAINERID oder docker save IMAGEID

(aktualisiert basierend auf Kommentare) senden

Dann was Werkzeug, das Sie verwenden möchten die Dateisysteme diff - Git, Rdiff usw.

+2

'docker export' nimmt eine Container-ID als Parameter, keine Bild-ID – noisecapella

+3

' docker save' ist für Bilder – nponeccop

+0

Nur für Klarheit , in Ihrem Beispiel sollte es 'docker export CONTAINER_ID' sein –

6

Wenn Sie die Container-ID oder den Namen (sogar den gestoppten Container) kennen, können Sie die Dateiliste bei Bedarf schnell und einfach auslagern.

$ docker export CONTAIN_ID_OR_NAME | tar tv 
-rwxr-xr-x 0 0  0   0 2 6 21:22 .dockerenv 
-rwxr-xr-x 0 0  0   0 2 6 21:22 .dockerinit 
drwxr-xr-x 0 0  0   0 10 21 13:46 bin/ 
-rwxr-xr-x 0 0  0  1021112 10 8 2014 bin/bash 
-rwxr-xr-x 0 0  0  31152 10 21 2013 bin/bunzip2 
-rwxr-xr-x 0 0  0   0 10 21 2013 bin/bzcat link to bin/bunzip2 
lrwxrwxrwx 0 0  0   0 10 21 2013 bin/bzcmp -> bzdiff 
-rwxr-xr-x 0 0  0  2140 10 21 2013 bin/bzdiff 
lrwxrwxrwx 0 0  0   0 10 21 2013 bin/bzegrep -> bzgrep 
-rwxr-xr-x 0 0  0  4877 10 21 2013 bin/bzexe 
...... 

Dann können Sie Liste in Datei speichern und zu Liste Dateien vergleichen.

Wenn Sie Bild-ID oder Namen zu verwenden, bestehen, können Sie erste Schicht der Dateiliste on-the-fly-Dump:

$ docker save alpine |tar xO '*/layer.tar' | tar tv 
drwxr-xr-x 0 0  0   0 12 27 06:32 bin/ 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/ash -> /bin/busybox 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/base64 -> /bin/busybox 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/bbconfig -> /bin/busybox 
-rwxr-xr-x 0 0  0  821408 10 27 01:15 bin/busybox 

Immerhin schlage ich vor, Sie die Container starten dann stoppen, dann Sie können eine zusammengeführte Dateiliste wie oben beschrieben erhalten.

2017/02/01: lesen DateienDer schnellste Weg Container Dateiliste zu zeigen, Sie sind frei, seine Wurzel dir ein:

# PID=$(docker inspect -f '{{.State.Pid}}' CONTAIN_ID_OR_NAME) 
# cd /proc/$PID/root && ls -lF 
drwxr-xr-x 0 0  0   0 12 27 06:32 bin/ 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/ash -> /bin/busybox 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/base64 -> /bin/busybox 
lrwxrwxrwx 0 0  0   0 12 27 06:32 bin/bbconfig -> /bin/busybox 
-rwxr-xr-x 0 0  0  821408 10 27 01:15 bin/busybox 

Hinweis, wenn Sie Docker-Maschine verwenden, Sie müssen zuerst durch docker-machine ssh dann sudo sh eingeben.

Jetzt erhalten Sie das Root-Verzeichnis der beiden Container, Sie können diff verwenden, um sie direkt zu vergleichen.

3

Werfen Sie einen Blick auf:

https://github.com/moul/docker-diff

Sie Brew Anweisungen für Mac installieren Liste, ich nehme an, es ein Bash-Skript ist, so dass ich davon ausgehen, es gemacht werden könnte in anderen * nix-Umgebungen zu arbeiten.

+1

Nettes Werkzeug. Zu Ihrer Information: Im Grunde werden die Container ausgeführt, in Tarball exportiert und die Dateiliste differiert. – wisbucky

0

Werfen Sie einen Blick auf:

https://github.com/GoogleCloudPlatform/container-diff

Dieses Tool kann lokal oder remote Docker Bilder diff und kann so tun Docker, ohne installiert werden. Es hat sowohl Datei- als auch Paketebene "differents" (zum Beispiel: apt, npm und pip), so dass Sie die Unterschiede in Paketen, die sich zwischen zwei Docker-Images geändert haben, leichter erkennen können.

Disclaimer: Ich bin ein Beitrag zu diesem Projekt

0

Dies ist für mich gearbeitet:

docker run -it e5cba87ecd29 bash -c 'find /path/to/files -type f | sort | xargs -I{} sha512sum {}' > /tmp/dockerfiles.e5cba87ecd29.txt 
docker run -it b1d19fe1a941 bash -c 'find /path/to/files -type f | sort | xargs -I{} sha512sum {}' > /tmp/dockerfiles.b1d19fe1a941.txt 
meld /tmp/dockerfiles* 

Wo e5cba87ecd29 und b1d19fe1a941 sind Bilder Ich bin an und/path/to/Dateien ist ein Verzeichnis was könnte "/" sein. Es listet alle Dateien auf, sortiert sie und fügt Hash für alle Fälle hinzu. Und meld hebt alle Unterschiede hervor.

Verwandte Themen