Ik'ben aan het denken om Docker te gebruiken om mijn afhankelijkheden te bouwen op een Continuous Integration (CI) server, zodat ik niet'alle runtimes en bibliotheken op de agents zelf hoef te installeren.
Om dit te bereiken zou ik de build artefacten die in de container zijn gebouwd terug naar de host moeten kopiëren. Is dat mogelijk?
Om een bestand van een container naar de host te kopiëren, kun je het commando
docker cp <containerId>:/file/path/within/container /host/path/target
Hier's een voorbeeld:
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Hier goofy_roentgen is de containernaam die ik kreeg van het volgende commando:
$ 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
Je kunt ook (een deel van) de container-ID gebruiken. Het volgende commando is gelijkwaardig aan het eerste
$ sudo docker cp 1b4a:/out_read.jpg .
Mount een "volume" en kopieer de artefacten daar naar toe:
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
Wanneer het bouwen is voltooid en de container niet meer draait, heeft het de artefacten van het bouwen al gekopieerd naar de artifacts
directory op de host.
Caveat: Wanneer je dit doet, kun je problemen krijgen met het gebruikers-id van de docker-gebruiker die overeenkomt met het gebruikers-id van de huidige draaiende gebruiker. Dat wil zeggen, de bestanden in /artifacts
zullen worden getoond als eigendom van de gebruiker met de UID van de gebruiker die in de docker container wordt gebruikt. Een manier om dit te omzeilen kan zijn om de UID van de aanroepende gebruiker's te gebruiken:
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
Mount een volume, kopieer de artefacten, pas owner id en group id aan:
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