Sto pensando di usare Docker per costruire le mie dipendenze su un server di integrazione continua (CI), in modo da non dover installare tutti i runtime e le librerie sugli agenti stessi.
Per ottenere questo avrei bisogno di copiare gli artefatti di costruzione che sono costruiti all'interno del contenitore nell'host. È possibile?
Per copiare un file da un contenitore all'host, si può usare il comando
docker cp <containerId>:/file/path/within/container /host/path/target
Ecco un esempio:
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Qui goofy_roentgen è il nome del contenitore che ho ottenuto dal seguente comando:
$ 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
Puoi anche usare (parte di) l'ID del Contenitore. Il seguente comando è equivalente al primo
$ sudo docker cp 1b4a:/out_read.jpg .
Montate un "volume" e copiate gli artefatti lì dentro:
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
Quindi quando la compilazione finisce e il contenitore non è più in esecuzione, ha già copiato gli artefatti dalla compilazione nella directory artifacts
sull'host.
Caveat: Quando si fa questo, si può incorrere in problemi con l'id dell'utente docker che corrisponde all'id dell'utente in esecuzione. Cioè, i file in /artifacts
saranno mostrati come di proprietà dell'utente con l'UID dell'utente usato all'interno del contenitore docker. Un modo per aggirare questo problema può essere quello di utilizzare l'UID dell'utente chiamante:
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
Monta un volume, copia gli artefatti, regola l'id del proprietario e l'id del gruppo:
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