dockerコンテナにコンパイラなどを入れ、更にそのコンテナにビルド対象のソースコードをマウントすることで、docker自体をビルド環境として使うことができる。
例えばC#のビルドであれば、monoのコンテナ(monoは.NETのオープンソース実装。monoのmsbuildはxbuildになる)を使って、PATHの通ったところに以下の様なシェルスクリプトを置けば、ビルドコマンドに早変わりする。
- /usr/local/bin/xbuild
#!/bin/sh eval "$(docker-machine env default)" docker run -it --rm -v `pwd`:/src --workdir=/src --entrypoint=xbuild mono $*
このスクリプトの前提は以下のとおり。
docker-machine env default
が構築済みであること- カレントディレクトリをdockerデーモンも参照できる状態にあること
ポイントは以下のとおり。
- カレントディレクトリをそのままマウントする。
--workdir
で、カレントディレクトリを指定する。--entrypoint=xbuild
で、ビルドコマンドを指定しておく。- 最後に
$*
を付けることで、このシェルスクリプトの引数を、そのまま--entrypoint
で指定したビルドコマンドの引数にする。 - -it --rmを付けることで、実行後のコンテナはすぐに削除される。
すると、以下のようにビルドができる。
$ xbuild ./TargetSolution.sln
コンテナ内で使うと、一切他のツールの依存関係を気にせず使えるので、dockerは正義だなと思う。 そのうち、ビルド環境になるコンテナだけを集めたパッケージマネージャが登場するんじゃないかな。
Qiitaにも投稿してます→ dockerをビルド環境として使う - Qiita