Ich denke darüber nach, Docker zu verwenden, um meine Abhängigkeiten von einem Continuous Integration (CI) -Server zu erstellen, damit ich nicht alle Laufzeiten und Bibliotheken auf den Agenten selbst installieren muss.
Um dies zu erreichen, müsste ich die Build-Artefakte, die im Container erstellt wurden, zurück in den Host kopieren. Ist das möglich?
docker
docker-container
file-copying
user2668128
quelle
quelle
Antworten:
Um eine Datei von einem Container auf den Host zu kopieren, können Sie den Befehl verwenden
Hier ist ein Beispiel:
Hier ist goofy_roentgen der Containername, den ich vom folgenden Befehl erhalten habe:
Sie können auch (einen Teil) der Container-ID verwenden . Der folgende Befehl entspricht dem ersten
quelle
docker ps -alq
.docker cp ...
docker cp -L
Symlinks kopierenSie müssen nicht verwenden
docker run
.Sie können es mit tun
docker create
.Aus den Dokumenten :
Sie können also Folgendes tun:
Hier startet man nie den Container. Das sah für mich von Vorteil aus.
quelle
-ti
erforderlich undbash
erforderlich?Hängen Sie ein "Volume" ein und kopieren Sie die Artefakte dorthin:
Wenn der Build abgeschlossen ist und der Container nicht mehr ausgeführt wird, wurden die Artefakte aus dem Build bereits in den kopiert
artifacts
Verzeichnis auf dem Host .Bearbeiten
Vorsichtsmaßnahme: Wenn Sie dies tun, können Probleme mit der Benutzer-ID des Docker-Benutzers auftreten, die mit der Benutzer-ID des aktuell ausgeführten Benutzers übereinstimmt. Das heißt, die Dateien in
/artifacts
werden als Eigentum des Benutzers mit der UID des Benutzers angezeigt , der im Docker-Container verwendet wird. Eine Möglichkeit, dies zu umgehen, besteht darin, die UID des anrufenden Benutzers zu verwenden:quelle
chown
Befehl verwenden, um die Benutzer-ID und die Gruppen-ID auf dem Host-Computer abzugleichen.Mounten Sie ein Volume, kopieren Sie die Artefakte, passen Sie die Eigentümer-ID und die Gruppen-ID an:
quelle
TLDR;
Beschreibung
docker run
mit einem Host-Volumechown
das Artefakt,cp
das Artefakt zum Host-Volume:Dieser Trick funktioniert, weil der
chown
Aufruf innerhalb des Heredocs dauert$(id -u):$(id -g)
Werte von außerhalb des laufenden Behälter; dh der Docker-Host.Die Vorteile sind:
docker container run --name
oderdocker container create --name
vorherdocker container rm
danachquelle
cp
und volumenbasierten Antworten. Auch für denid
Trick für den Besitz, das ist manchmal ein echtesDie meisten Antworten geben nicht an, dass der Container ausgeführt werden muss, bevor er
docker cp
funktioniert:quelle
Windows Hyper-V
ist es anscheinend notwendig , den Container zu stoppen, bevor eine Datei kopiert wird .Wenn Sie keinen laufenden Container haben, nur ein Bild, und davon ausgehen, dass Sie nur eine Textdatei kopieren möchten, können Sie Folgendes tun:
quelle
Ich poste dies für alle, die Docker für Mac verwenden. Das hat bei mir funktioniert:
Beachten Sie, dass , wenn ich mit Halterung ,
-v
dassbackup
Verzeichnis automatisch erstellt wird.Ich hoffe, dass dies eines Tages für jemanden nützlich ist. :) :)
quelle
volumes
Befehl im Stammverzeichnis von config.yml, damit Volumes für mehrere Container zugänglich sind.Wenn Sie nur eine Datei aus einem Image (anstelle eines laufenden Containers) ziehen möchten, können Sie Folgendes tun:
docker run --rm <image> cat <source> > <local_dest>
Dadurch wird der Container aufgerufen, die neue Datei geschrieben und der Container entfernt. Ein Nachteil ist jedoch, dass die Dateiberechtigungen und das Änderungsdatum nicht erhalten bleiben.
quelle
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
quelle
Mit der Version von Docker 19.03 können Sie das Erstellen des Containers und sogar das Erstellen eines Images überspringen. Bei BuildKit-basierten Builds gibt es eine Option zum Ändern des Ausgabeziels. Sie können dies verwenden, um die Ergebnisse des Builds in Ihr lokales Verzeichnis und nicht in ein Image zu schreiben. Beispiel: Hier ist ein Build einer Go-Binärdatei:
Aus der obigen Docker-Datei erstelle ich die
artifact
Bühne, die nur die Dateien enthält, die ich exportieren möchte. Mit dem neu eingeführten--output
Flag kann ich diese in ein lokales Verzeichnis anstatt in ein Bild schreiben. Dies muss mit der BuildKit-Engine durchgeführt werden, die mit 19.03 ausgeliefert wird:Nach Abschluss des Builds wurde die
app
Binärdatei exportiert:Docker hat andere Optionen für das
--output
Flag, die in seinem vorgelagerten BuildKit-Repo dokumentiert sind: https://github.com/moby/buildkit#outputquelle
Als allgemeinere Lösung gibt es ein CloudBees-Plugin, das Jenkins in einem Docker-Container erstellen kann . Sie können ein zu verwendendes Image aus einer Docker-Registrierung auswählen oder eine Docker-Datei definieren, die erstellt und verwendet werden soll.
Der Arbeitsbereich wird als Volume (mit dem entsprechenden Benutzer) in den Container eingebunden, als Arbeitsverzeichnis festgelegt und die von Ihnen angeforderten Befehle (innerhalb des Containers) ausgeführt. Sie können dazu auch das Docker-Workflow-Plugin (wenn Sie Code der Benutzeroberfläche vorziehen) mit dem Befehl image.inside () {} verwenden.
Grundsätzlich alles in Ihren CI / CD-Server und noch einige mehr.
quelle
Ich habe PowerShell (Admin) mit diesem Befehl verwendet.
Beispiel
quelle
Eine weitere gute Option besteht darin, zuerst den Container zu erstellen und ihn dann mit dem Flag -c und dem Shell-Interpreter auszuführen, um einige Befehle auszuführen
Der obige Befehl führt dies aus:
-ich = Führe den Container im interaktiven Modus aus
--rm = hat den Container nach der Ausführung entfernt.
-v = hat einen Ordner als Volume von Ihrem Hostpfad zum Containerpfad freigegeben.
Schließlich können Sie mit / bin / sh -c einen Befehl als Parameter einführen, und dieser Befehl kopiert Ihre Hausaufgaben-Dateien in den Containerpfad.
Ich hoffe, diese zusätzliche Antwort kann Ihnen helfen
quelle
Erstellen Sie ein Datenverzeichnis auf dem Hostsystem (außerhalb des Containers) und hängen Sie dieses in ein Verzeichnis ein, das innerhalb des Containers sichtbar ist. Dadurch werden die Dateien an einem bekannten Speicherort auf dem Hostsystem abgelegt, und Tools und Anwendungen auf dem Hostsystem können problemlos auf die Dateien zugreifen
quelle
Erstellen Sie einen Pfad, in den Sie die Datei kopieren möchten, und verwenden Sie dann:
quelle
Sie können
bind
anstelle von verwenden,volume
wenn Sie nur einen Ordner bereitstellen möchten, keinen speziellen Speicher für einen Container erstellen:Erstellen Sie Ihr Bild mit Tag:
docker build . -t <image>
Führen Sie Ihr Image aus und binden Sie das aktuelle Verzeichnis $ (pwd), in dem app.py gespeichert ist, und ordnen Sie es / root / example / in Ihrem Container zu.
docker run --mount type=bind,source="$(pwd)",target=/root/example/ <image> python app.py
quelle
Dies kann auch im SDK erfolgen, beispielsweise in Python. Wenn Sie bereits einen Container erstellt haben, können Sie den Namen über die Konsole nachschlagen (
docker ps -a
suchen.) Der Name scheint eine Verkettung eines Wissenschaftlers und eines Adjektivs (dh "entspannter_Pasteur") zu sein.Check out
help(container.get_archive)
:Dann wird so etwas aus dem angegebenen Pfad (/ output) im Container zu Ihrem Host-Computer gezogen und der Teer entpackt.
quelle