Ich denke an die Verwendung von Docker, um meine Abhängigkeiten auf einem Continuous Integration (CI) Server zu erstellen, so dass 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 werden, zurück auf den Host kopieren. Ist das möglich?
Um eine Datei aus einem Container auf den Host zu kopieren, können Sie den Befehl
docker cp <containerId>:/file/path/within/container /host/path/target
Hier ist ein Beispiel:
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Hier ist goofy_roentgen der Containername, den ich mit dem folgenden Befehl erhalten habe:
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b4ad9311e93 bamos/openface "/bin/bash" 33 minutes ago Up 33 minutes 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp goofy_roentgen
Sie können auch (einen Teil) der Container-ID verwenden. Der folgende Befehl ist äquivalent zum ersten
$ sudo docker cp 1b4a:/out_read.jpg .
Hängen Sie ein "Volume" ein und kopieren Sie die Artefakte dorthin:
mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# ... build software here ...
cp <artifact> /artifacts
# ... copy more artifacts into `/artifacts` ...
COMMANDS
Wenn dann der Build abgeschlossen ist und der Container nicht mehr läuft, hat er die Artefakte des Builds bereits in das Verzeichnis "Artefakte" auf dem Host kopiert.
Caveat: Wenn Sie dies tun, kann es zu Problemen kommen, wenn die Benutzerkennung des Docker-Benutzers mit der Benutzerkennung des aktuell laufenden Benutzers übereinstimmt. Das heißt, die Dateien in /artifacts
werden als Eigentum des Benutzers mit der UID des im Docker-Container verwendeten Benutzers angezeigt. Eine Möglichkeit, dies zu umgehen, ist die Verwendung der UID des aufrufenden Benutzers:
docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \
ubuntu:14.04 sh << COMMANDS
# Since $(id -u) owns /working_dir, you should be okay running commands here
# and having them work. Then copy stuff into /working_dir/artifacts .
COMMANDS
Mounten Sie ein Volume, kopieren Sie die Artefakte, passen Sie die Eigentümer- und Gruppen-ID an:
mkdir artifacts
docker run -i --rm -v ${PWD}/artifacts:/mnt/artifacts centos:6 /bin/bash << COMMANDS
ls -la > /mnt/artifacts/ls.txt
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /mnt/artifacts
COMMANDS