J’envisage d’utiliser Docker pour construire mes dépendances sur un serveur d’intégration continue (IC), afin de ne pas avoir à installer tous les moteurs d’exécution et toutes les bibliothèques sur les agents eux-mêmes.
Pour ce faire, j'ai besoin de copier les artefacts de construction qui sont construits dans le conteneur sur l'hôte. Cela est-il possible ?
Afin de copier un fichier d'un conteneur vers l'hôte, vous pouvez utiliser la commande
docker cp <containerId>:/file/path/within/container /host/path/target
Voici un exemple :
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Ici goofy_roentgen est le nom du conteneur que j'ai obtenu à partir de la commande suivante :
$ 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
Vous pouvez également utiliser (une partie de) l' ID du conteneur. La commande suivante est équivalente à la première
$ sudo docker cp 1b4a:/out_read.jpg .
Montez un "volume" et copiez-y les artefacts :
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
Ensuite, lorsque la construction se termine et que le conteneur n'est plus en cours d'exécution, il a déjà copié les artefacts de la construction dans le répertoire artifacts
sur l'hôte.
Caveat: Lorsque vous faites cela, vous pouvez rencontrer des problèmes avec l'identifiant de l'utilisateur docker correspondant à l'identifiant de l'utilisateur en cours d'exécution. C'est-à-dire que les fichiers dans /artifacts
seront montrés comme appartenant à l'utilisateur avec l'UID de l'utilisateur utilisé dans le conteneur docker. Une façon de contourner ce problème peut être d'utiliser l'UID de l'utilisateur appelant :
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
Monter un volume, copier les artefacts, ajuster l'id du propriétaire et l'id du groupe :
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