継続的インテグレーション(CI)サーバー上で依存関係を構築するのにDockerを使おうと考えています。そうすれば、すべてのランタイムとライブラリをエージェント自体にインストールする必要がなくなります。
これを実現するには、コンテナ内でビルドされた成果物をホストにコピーする必要があります。それは可能ですか?
コンテナからホストにファイルをコピーするためには、以下のコマンドを使用します。
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
また、コンテナIDを(一部)使用することもできます。次のコマンドは、最初のコマンドと同じです。
$ 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
ディレクトリにすでにコピーされています。
注意点:この作業を行うと、dockerユーザのユーザIDと、現在実行中のユーザのユーザIDが一致しないという問題が発生することがあります。つまり、/artifacts
内のファイルは、dockerコンテナ内で使用されているユーザーのUIDを持つユーザーが所有していると表示されてしまいます。これを回避するには、呼び出したユーザー'の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
ボリュームのマウント、アーティファクトのコピー、オーナーIDとグループ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