Estoy pensando en usar Docker para construir mis dependencias en un servidor de Integración Continua (CI), para no tener que instalar todos los tiempos de ejecución y las bibliotecas en los propios agentes.
Para lograr esto necesitaría copiar los artefactos de construcción que se construyen dentro del contenedor de nuevo en el host. ¿Es esto posible?
Para copiar un archivo de un contenedor al host, puede utilizar el comando
docker cp <containerId>:/file/path/within/container /host/path/target
Este es un ejemplo:
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Aquí goofy_roentgen es el nombre del contenedor que obtuve del siguiente 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
También puede utilizar (parte de) el Identificador del contenedor. El siguiente comando es equivalente al primero
$ sudo docker cp 1b4a:/out_read.jpg .
Monta un "volumen" y copia los artefactos allí:
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
Entonces, cuando la construcción termina y el contenedor ya no se ejecuta, ya ha copiado los artefactos de la construcción en el directorio artifacts
en el host.
**Cuando haces esto, puedes tener problemas con el id de usuario del usuario docker que coincide con el id de usuario del usuario que se está ejecutando. Es decir, los archivos en /artifacts
se mostrarán como propiedad del usuario con el UID del usuario utilizado dentro del contenedor docker. Una forma de evitar esto puede ser utilizar el UID del usuario que llama:
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
Montar un volumen, copiar los artefactos, ajustar el id de propietario y el id de grupo:
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