Jag funderar på att använda Docker för att bygga mina beroenden på en CI-server (Continuous Integration), så att jag inte behöver installera alla körtider och bibliotek på själva agenterna.
För att uppnå detta skulle jag behöva kopiera de byggartefakter som byggs i behållaren tillbaka till värden. Är det möjligt?
För att kopiera en fil från en behållare till värden kan du använda kommandot
docker cp <containerId>:/file/path/within/container /host/path/target
Här är ett exempel:
$ sudo docker cp goofy_roentgen:/out_read.jpg .
Här är goofy_roentgen det behållarnamn som jag fick från följande 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 också använda (en del av) Container ID. Följande kommando är likvärdigt med det första
$ sudo docker cp 1b4a:/out_read.jpg .
Montera en "volym" och kopiera artefakterna 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 byggandet avslutas och containern inte längre körs har den redan kopierat artefakterna från byggandet till artifacts
-katalogen på värden.
Caveat: När du gör detta kan du få problem med att användaridet för docker-användaren matchar användaridet för den nuvarande körande användaren. Det vill säga, filerna i /artifacts
kommer att visas som ägda av användaren med UID för den användare som används inuti dockercontainern. Ett sätt att kringgå detta kan vara att använda den anropande användarens 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
Montera en volym, kopiera artefakter, justera ägar-id och grupp-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