Смятам да използвам Docker за изграждане на моите зависимости на сървър за непрекъснато интегриране (CI), за да не се налага да инсталирам всички изпълними програми и библиотеки на самите агенти.
За да постигна това, ще трябва да копирам артефактите за изграждане, които са изградени в контейнера, обратно в хоста. Възможно ли е това?
За да копирате файл от контейнер към хоста, можете да използвате командата
docker cp <containerId>:/file/path/within/container /host/path/target
Ето един пример:
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Тук goofy_roentgen е името на контейнера, което получих от следната команда:
$ 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
Можете също така да използвате (част от) идентификатора на контейнера. Следната команда е еквивалентна на първата
$ sudo docker cp 1b4a:/out_read.jpg .
Монтирайте "том" и копирайте артефактите в него:
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
След това, когато сглобяването завърши и контейнерът вече не работи, той вече е копирал артефактите от сглобяването в директорията artifacts
на хоста.
Caveat: Когато правите това, може да се сблъскате с проблеми, свързани с това, че user id на потребителя на docker съвпада с user id на текущия работещ потребител. Това означава, че файловете в /artifacts
ще се показват като притежавани от потребителя с UID на потребителя, използван вътре в контейнера docker. Начин да се избегне това може да бъде използването на UID на извикващия потребител:
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
Монтирайте том, копирайте артефактите, коригирайте идентификатора на собственика и идентификатора на групата:
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