Datei aus Docker-Image extrahieren?

23

Ich möchte eine Datei aus einem Docker-Image extrahieren, ohne das Image ausführen zu müssen.

Die docker saveOption ist für mich derzeit keine praktikable Option, da sie zu viele Dateien speichert, nur um eine bestimmte Datei zu entlarven.

BlakBat
quelle
Welche Distribution benutzt du?
Ryekayo
@ryekayo: Ubuntu 14, Docker 1.12.4 (API 1.24)
BlakBat

Antworten:

20

Mit den folgenden Befehlen können Sie Dateien aus einem Bild extrahieren:

docker create $image  # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id

Laut docker create Dokumentation wird der Container nicht ausgeführt:

Der docker createBefehl erstellt eine beschreibbare Containerebene über dem angegebenen Bild und bereitet sie auf die Ausführung des angegebenen Befehls vor. Die Container-ID wird dann auf gedruckt STDOUT. Dies ist vergleichbar mit der docker run -dAusnahme, dass der Container niemals gestartet wird. Sie können dann den docker start <container_id>Befehl verwenden, um den Container an einem beliebigen Punkt zu starten.


Als Referenz (meine vorherige Antwort) ist die folgende Methode zum Extrahieren einer Datei aus einem Bild weniger effizient:

docker run some_image cat $file_path > $output_path
bbc
quelle
3
Möglicherweise möchten Sie den Eintrittspunkt überschreiben. docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Andrew
1
Dadurch wird das Image ausgeführt, und genau das wollte ich nicht tun, wie in meiner Frage angegeben.
BlakBat
Ah, das ist ein guter Punkt. Ich bin damit einverstanden, dass meine aktuelle Antwort dann nicht zufriedenstellend ist.
BBC
1
@BlakBat Funktioniert diese aktualisierte Antwort für Sie? Ich denke, ich hätte eine neue Antwort erstellen sollen, aber das ist jetzt erledigt.
BBC
1
@bbc Diese aktualisierte Antwort startet in der Tat keinen Container (der springende Punkt der Frage) und erfordert nicht, root zu sein.
BlakBat
2

Keines der oben genannten hat bei mir funktioniert. Der vollständige Arbeitsbefehl lautet:

docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename

Ohne Anführungszeichen catwird ohne Dateiname übergeben, daher weiß es nicht, was angezeigt werden soll. Es ist auch eine gute Idee, den Container nach Beendigung des Befehls zu löschen.

Sekrett
quelle
Der Befehl, auf den Sie sich beziehen, funktioniert nur in Abhängigkeit vom Docker und der korrekten Einstellung von ENTRYPOINT / CMD in der Docker-Datei. Das hat nichts mit Zitieren zu tun. Sie sagen auch, Sie möchten den Container löschen, geben jedoch --rm an. Zuletzt, als ich meine Frage gestellt hatte, gab ich "ohne das Bild ausführen zu müssen" an und keine Antworten waren eine Lösung, die dies berücksichtigte.
BlakBat
1
Unabhängig davon, welche CMD und ENTRYPOINT in Dockerfile festgelegt wurden, überschreibe ich beide, damit es immer funktioniert (unter Linux natürlich). Was meinst du mit "abhängig vom Hafenarbeiter"? Einstellungen, Version, env, was? Ihre Frage ist nicht richtig, da Bilder nicht ausgeführt werden können, sondern nur Container. Ich denke es gibt keine richtige Antwort, man muss sich mit vielen Dateien auseinandersetzen oder einen temporären Container anlegen. --rm entfernt den temporären Container, andere Antworten hinterlassen einen Müll auf Ihrer Festplatte.
Sekrett
1

Wenn ich mich nicht irre, glaube ich, dass Docker-Container zwischengespeicherte Dateien speichern, die im folgenden Verzeichnis für Ubuntu erstellt wurden:

/var/lib/docker/aufs/diff/<container_id>

Von dort aus sollten Sie auf das Dateisystem zugreifen und Ihre Datei (en) abrufen können.

Ryekayo
quelle
Nee. Dieses Verzeichnis enthält nur layersizeund jsonund ist auch nicht vom Benutzer lesbar (selbst wenn sich der Benutzer in der Docker-Gruppe befindet). /var/lib/docker/aufs/diffEnthält die gesuchte Datei (wird jedoch nicht nach Container-ID kategorisiert) und ist auch nicht lesbar.
BlakBat
Gib mir ein paar und ich werde es nachschlagen. Ich weiß, dass es eine Möglichkeit gibt, die Dateien abzurufen, ohne den Container zu betreten oder auszuführen.
Ryekayo
Wie wird angezeigt, dass der Text nicht lesbar ist? Ich habe ein Beispiel gefunden, in dem Sie Textdateien aus den Containern abrufen können, indem Sie das Verzeichnis / var / lib / docker / aufs / diff / *
aufrufen
Mein Fehler. Benutzer kann zugreifen /var/lib/docker/aufs(aber nicht alle anderen Verzeichnisse in /var/lib/docker/)
BlakBat
Können Sie als root zugreifen?
Ryekayo
0

Wenn das Speichern der vollständigen Ausgabe von docker savekeine Option ist, können Sie Pipelines verwenden, um nur die benötigte Datei daraus zu extrahieren.

Da es sich bei der Ausgabe leider um einen Teer von Teeren handelt, kann es sich um einen leicht iterativen Prozess handeln.

Was ich getan habe, als ich gerade eine Datei extrahieren musste, war:

1) Bestimmen Sie, welche Version des Bildes die Datei, an der Sie interessiert sind, zuletzt geändert hat (wie Sie dies tun, hängt wahrscheinlich von Ihrem Bild ab) und an welchem ​​Datum es erstellt / gespeichert wurde

2) Holen Sie sich das vollständige Inhaltsverzeichnis aus der Ausgabe des docker saveBefehls mit:

docker save IMAGE_NAME | tar -tvf -

3) Bereinigen Sie die layer.tarDatei (en) in der Ausgabe dieses Befehls, die mit dem Datum des in Schritt 1 bestimmten Bildes übereinstimmen. (Sie können hinzufügen, | grep layer.tarum nur diese Dateien anzuzeigen.)

4) Extrahieren Sie diese layer.tarDatei, um sie zu standardisieren, und rufen Sie das Inhaltsverzeichnis ab:

docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -

5) Überprüfen Sie, ob die gewünschte Datei aufgelistet ist, und extrahieren Sie sie, sobald Sie den Namen gefunden haben:

docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE

Wenn es mehr als eine layer.tarDatei gibt, die dem in Schritt 2/3 gesuchten Datum entspricht, müssen Sie möglicherweise Schritt 4 für jede einzelne wiederholen, bis Sie die richtige gefunden haben

Ersetzen Sie den Text in Großbuchstaben in den obigen Befehlen durch die richtigen Bildnamen, Prüfsummen und Dateinamen für Ihren Fall.

Michael Firth
quelle