I'estou pensando em usar o Docker para construir minhas dependências em um servidor de Integração Contínua (CI), para que eu não'não tenha que instalar todos os tempos de execução e bibliotecas nos próprios agentes.
Para conseguir isso, eu precisaria copiar os artefatos de construção que são construídos dentro do contêiner de volta para o anfitrião. Isso é possível?
Para copiar um arquivo de um container para o host, você pode usar o comando
docker cp <containerId>:/file/path/within/container /host/path/target
Aqui's um exemplo:
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Aqui **goofy_roentgen*** é o nome do recipiente que recebi do seguinte 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
Você também pode usar (parte de) o **ID do recipiente***. O seguinte comando é equivalente ao primeiro
$ sudo docker cp 1b4a:/out_read.jpg .
Monte um " volume" e copie os artefatos para lá:
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
Então quando o build termina e o container não está mais rodando, ele já copiou os artefatos do build para o diretório artifacts
no host.
Caveat: Quando você faz isso, você pode ter problemas com o id do usuário da doca que corresponde ao id do usuário atual em execução. Ou seja, os arquivos em `/artifatos' serão mostrados como sendo de propriedade do usuário com o UID do usuário utilizado dentro do container da doca. Uma maneira de contornar isso pode ser usar o UID do usuário que está chamando's:
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
Monte um volume, copie os artefatos, ajuste a identificação do proprietário e a identificação do 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