Laut docker createDokumentation 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
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.
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.
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.
Antworten:
Mit den folgenden Befehlen können Sie Dateien aus einem Bild extrahieren:
Laut
docker create
Dokumentation wird der Container nicht ausgeführt:Als Referenz (meine vorherige Antwort) ist die folgende Methode zum Extrahieren einer Datei aus einem Bild weniger effizient:
quelle
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.quelle
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.
quelle
layersize
undjson
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: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:5) Überprüfen Sie, ob die gewünschte Datei aufgelistet ist, und extrahieren Sie sie, sobald Sie den Namen gefunden haben:
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 habenErsetzen Sie den Text in Großbuchstaben in den obigen Befehlen durch die richtigen Bildnamen, Prüfsummen und Dateinamen für Ihren Fall.
quelle