Meine Frage bezieht sich auf diese Frage zum Kopieren von Dateien von Containern auf Hosts. Ich habe eine Docker-Datei, die Abhängigkeiten abruft, ein Build-Artefakt aus dem Quellcode kompiliert und eine ausführbare Datei ausführt. Ich möchte auch das Build-Artefakt kopieren (in meinem Fall ist es ein .zip
von sbt dist
'../ target /' erstelltes, aber ich denke, diese Frage gilt auch für Gläser, Binärdateien usw.).
docker cp
arbeitet an Containern, nicht an Bildern; Muss ich einen Container starten, um eine Datei daraus zu erhalten? In einem Skript habe ich versucht, /bin/bash
im interaktiven Modus im Hintergrund zu laufen , die Datei zu kopieren und dann den Container zu beenden, aber das scheint kludgey. Gibt es einen besseren Weg?
Andererseits möchte ich vermeiden, dass eine .tar
Datei nach dem Ausführen entpackt wirddocker save $IMAGENAME
entpacken, um nur eine Datei herauszuholen (aber das scheint derzeit die einfachste, wenn auch langsamste Option zu sein).
Ich würde Docker-Volumes verwenden, z.
docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out
Ich arbeite jedoch unter boot2docker
OSX und weiß nicht, wie ich direkt in mein Mac-Host-Dateisystem schreiben soll (Lese- / Schreib-Volumes werden in meiner boot2docker-VM bereitgestellt, was bedeutet, dass ich ein Skript zum Extrahieren blah.zip
aus einem Image nicht einfach freigeben kann andere. Gedanken?
quelle
create
Befehl hinzugefügt / entfernt (es ist nicht in 1.01 vorhanden)docker create
wurde in Docker 1.3, blog.docker.com/2014/10/…docker cp $id:path > local-tar-file
perfekt funktioniert hat.Leider scheint es keine Möglichkeit zu geben, Dateien direkt von Docker-Images zu kopieren. Sie müssen zuerst einen Container erstellen und dann die Datei aus dem Container kopieren.
Wenn Ihr Image jedoch einen
cat
Befehl enthält (und dies in vielen Fällen der Fall ist), können Sie dies mit einem einzigen Befehl tun:Wenn Ihr Bild nicht enthält
cat
, erstellen Sie einfach einen Container und verwenden Sie dendocker cp
in Igor's Antwort vorgeschlagenen Befehl.quelle
Eine viel schnellere Option besteht darin, die Datei vom laufenden Container auf ein bereitgestelltes Volume zu kopieren:
** VS **
quelle
cat a >b
vscp a b
ähnliche Timings wie hier gezeigt haben. Wenn sich der Quell- und der Zielpfad auf verschiedenen Dateisystemen befinden, führen beide Beispiele zu einer vollständigen Byte-für-Byte-Kopie.Der Kommentar der Eltern zeigte bereits, wie man Katze benutzt . Sie können Teer auch auf ähnliche Weise verwenden:
quelle
docker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
wollte eine einzeilige Lösung liefern
edit: container muss in dieser lösung nicht einmal ausgeführt werden
quelle
Eine weitere (kurze) Antwort auf dieses Problem:
quelle
Ich benutze boot2docker unter MacOS. Ich kann Ihnen versichern, dass Skripte, die auf "Docker CP" basieren, portabel sind. Da jeder Befehl in boot2docker weitergeleitet wird, wird der Binärstrom dann an den Docker-Befehlszeilenclient zurückgeleitet, der auf Ihrem Mac ausgeführt wird. Schreibvorgänge vom Docker-Client werden also im Server ausgeführt und in die ausführende Client-Instanz zurückgeschrieben!
Ich teile ein Backup-Skript für Docker-Volumes mit jedem Docker-Container, den ich zur Verfügung stelle, und meine Backup-Skripte werden sowohl unter Linux als auch unter MacOS mit boot2docker getestet. Die Backups können problemlos zwischen Plattformen ausgetauscht werden. Grundsätzlich führe ich den folgenden Befehl in meinem Skript aus:
Ich habe bereits Archive zwischen dem Linux-Container und meinem Mac-Container verschoben, ohne das Sicherungs- oder Wiederherstellungsskript anzupassen. Wenn Sie dies möchten, finden Sie im gesamten Skript ein Tutorial: blacklabelops / jenkins
quelle
Sie können einen lokalen Pfad auf dem Host an einen Pfad im Container binden und dann
cp
die gewünschten Dateien an diesen Pfad am Ende Ihres Skripts.Danach muss nicht mehr kopiert werden.
quelle