Jeg vurderer å bruke Docker til å bygge mine avhengigheter på en Continuous Integration (CI)-server, slik at jeg ikke trenger å installere alle kjøretidene og bibliotekene på selve agentene.
For å oppnå dette må jeg kopiere byggeartefaktene som er bygget inne i containeren tilbake til verten. Er det mulig?
For å kopiere en fil fra en container til verten, kan du bruke kommandoen
docker cp <containerId>:/file/path/within/container /host/path/target
Her'er et eksempel:
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Her er goofy_roentgen beholdernavnet jeg fikk fra følgende kommando:
$ 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
Du kan også bruke (en del av) Container ID. Følgende kommando tilsvarer den første
$ sudo docker cp 1b4a:/out_read.jpg .
Monter et "volum" og kopier artefaktene dit:
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
Når byggingen er ferdig og containeren ikke lenger kjører, har den allerede kopiert artefaktene fra byggingen til artifacts
-katalogen på verten.
Caveat: Når du gjør dette, kan du støte på problemer med bruker-ID-en til docker-brukeren som samsvarer med bruker-ID-en til den nåværende kjørende brukeren. Det vil si at filene i /artifacts
vil bli vist som eid av brukeren med UID-en til brukeren som brukes inne i docker-containeren. En måte å omgå dette på kan være å bruke den anropende brukerens 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
Monter et volum, kopier artefaktene, juster eier-ID og gruppe-ID:
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