Ich möchte eine Datei aus einem Docker-Image extrahieren, ohne das Image ausführen zu müssen.
Die docker save
Option ist für mich derzeit keine praktikable Option, da sie zu viele Dateien speichert, nur um eine bestimmte Datei zu entlarven.
Ich möchte eine Datei aus einem Docker-Image extrahieren, ohne das Image ausführen zu müssen.
Die docker save
Option ist für mich derzeit keine praktikable Option, da sie zu viele Dateien speichert, nur um eine bestimmte Datei zu entlarven.
Antworten:
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 create
Befehl 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 gedrucktSTDOUT
. Dies ist vergleichbar mit derdocker run -d
Ausnahme, dass der Container niemals gestartet wird. Sie können dann dendocker 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
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
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 cat
wird 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.
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.
layersize
und json
und ist auch nicht vom Benutzer lesbar (selbst wenn sich der Benutzer in der Docker-Gruppe befindet). /var/lib/docker/aufs/diff
Enthält die gesuchte Datei (wird jedoch nicht nach Container-ID kategorisiert) und ist auch nicht lesbar.
/var/lib/docker/aufs
(aber nicht alle anderen Verzeichnisse in /var/lib/docker/
)
Wenn das Speichern der vollständigen Ausgabe von docker save
keine 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 save
Befehls mit:
docker save IMAGE_NAME | tar -tvf -
3) Bereinigen Sie die layer.tar
Datei (en) in der Ausgabe dieses Befehls, die mit dem Datum des in Schritt 1 bestimmten Bildes übereinstimmen. (Sie können hinzufügen, | grep layer.tar
um nur diese Dateien anzuzeigen.)
4) Extrahieren Sie diese layer.tar
Datei, 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.tar
Datei 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.