エージェント自体にすべてのランタイムとライブラリをインストールする必要がないように、Docker を使用して継続的インテグレーション (CI) サーバーに依存関係を構築することを考えています。
これを実現するには、コンテナ内でビルドされたビルド アーティファクトをホストにコピーする必要があります。それは可能ですか?
エージェント自体にすべてのランタイムとライブラリをインストールする必要がないように、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
Container 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 -g)
chown -R $(id -u):$(id -g) /mnt/artifacts
COMMANDS
編集: 一部のコマンド$(id -u)
はバックスラッシュが付けられているため、コンテナ内で処理されることに注意してください。バックスラッシュが付けられていないコマンドは、コマンドがコンテナに送信される前に、ホスト マシンで実行されているシェルによって処理されます。
Windows の場合:
DockerContainer から LocalMachineへ
$docker cp containerId:/sourceFilePath/someFile.txt C:/localMachineDestinationFolder
LocalMachineからDockerContainer へ
$docker cp C:/localMachineSourceFolder/someFile.txt containerId:/containerDestinationFolder
より一般的な解決策として、Jenkins が Docker コンテナ内に構築するための CloudBees プラグインがあります。Docker レジストリから使用するイメージを選択するか、ビルドして使用する Dockerfile を定義できます。
ワークスペースを (適切なユーザーを使用して) ボリュームとしてコンテナーにマウントし、それを作業ディレクトリとして設定し、要求したコマンドを (コンテナー内で) 実行します。image.inside() {} コマンドを使用して docker-workflow プラグイン (UI よりもコードを好む場合) を使用してこれを行うこともできます。
基本的に、これらすべてが CI/CD サーバーに焼き付けられ、さらにいくつかが焼き付けられます。