Edited at

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

More than 3 years have passed since last update.

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で作成すると、それが実現される。



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


  • カレントディレクトリをそのままマウントする。


  • --workdirで、カレントディレクトリを指定する。


  • --entrypoint=xbuildで、ビルドコマンドを指定しておく。

  • 最後に$*を付けることで、このシェルスクリプトの引数を、そのまま--entrypointで指定したビルドコマンドの引数にする。

  • -it --rmを付けることで、実行後のコンテナはすぐに削除される。

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

$ xbuild ./TargetSolution.sln

コンテナ内で使うと、一切他のツールの依存関係を気にせず使えるので、dockerは正義だなと思う。

そのうち、ビルド環境になるコンテナだけを集めたパッケージマネージャが登場するんじゃないかな。