dockerをビルド環境として使う

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デーモンも参照できる状態にあること
    • WindowsMacの場合、docker-machine create -d virtualbox defaultで作成すると、それが実現される。

ポイントは以下のとおり。

  • カレントディレクトリをそのままマウントする。
  • --workdirで、カレントディレクトリを指定する。
  • --entrypoint=xbuildで、ビルドコマンドを指定しておく。
  • 最後に$*を付けることで、このシェルスクリプトの引数を、そのまま--entrypointで指定したビルドコマンドの引数にする。
  • -it --rmを付けることで、実行後のコンテナはすぐに削除される。

すると、以下のようにビルドができる。

$ xbuild ./TargetSolution.sln

コンテナ内で使うと、一切他のツールの依存関係を気にせず使えるので、dockerは正義だなと思う。 そのうち、ビルド環境になるコンテナだけを集めたパッケージマネージャが登場するんじゃないかな。

Qiitaにも投稿してます→ dockerをビルド環境として使う - Qiita