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デーモンも参照できる状態にあること
- WindowsとMacの場合、
docker-machine create -d virtualbox default
で作成すると、それが実現される。
- WindowsとMacの場合、
ポイントは以下のとおり。
- カレントディレクトリをそのままマウントする。
-
--workdir
で、カレントディレクトリを指定する。 -
--entrypoint=xbuild
で、ビルドコマンドを指定しておく。 - 最後に
$*
を付けることで、このシェルスクリプトの引数を、そのまま--entrypoint
で指定したビルドコマンドの引数にする。 - -it --rmを付けることで、実行後のコンテナはすぐに削除される。
すると、以下のようにビルドができる。
$ xbuild ./TargetSolution.sln
コンテナ内で使うと、一切他のツールの依存関係を気にせず使えるので、dockerは正義だなと思う。
そのうち、ビルド環境になるコンテナだけを集めたパッケージマネージャが登場するんじゃないかな。