Dockerをソースからビルドしてみた
昨日に続いてDockerの話。Dockerに関しては驚くことばかりです。検索するとほぼ一年前に盛り上がっていたようですね。周回遅れです。
DockerはGo言語で書かれていてソースコードがGithubで公開されています。
GitHub - moby/moby: Moby Project - a collaborative project for the container ecosystem to assemble container-based systems
このソースをとってきてビルドしてみました。
$ git clone https://github.com/dotcloud/docker $ git checkout -b work v1.0.1
ビルドの方法がすぐに見つけられなかったので、とりあえずMakefileがあることだしmakeコマンドを実行してみました。
$ make
え?!え?!何が起こった?
いきなりdockerが起動してコンテナをビルドし始めました。ubuntu 14.04を取ってきて、apt-getでツールチェインをインストールして、goのソースを取ってきてそれをビルドして ...
そのビルドログ
そして最後にはたったひとつの実行ファイルがごろんとできていました。それ以外の中間ファイルが全くないのが不思議な感じです。全てのビルドはコンテナの中で行われたからです。
$ ls -l bundles/1.0.1/binary/ total 17132 lrwxrwxrwx 1 root root 12 Jun 26 22:24 docker -> docker-1.0.1 -rwxr-xr-x 1 root root 17533452 Jun 26 22:24 docker-1.0.1 -rw-r--r-- 1 root root 47 Jun 26 22:24 docker-1.0.1.md5 -rw-r--r-- 1 root root 79 Jun 26 22:24 docker-1.0.1.sha256 $ file bundles/1.0.1/binary/* bundles/1.0.1/binary/docker: symbolic link to `docker-1.0.1' bundles/1.0.1/binary/docker-1.0.1: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=0xe58e81b17140670d7a3228ea83ee3861fb87cd0b, not stripped bundles/1.0.1/binary/docker-1.0.1.md5: ASCII text bundles/1.0.1/binary/docker-1.0.1.sha256: ASCII text
これはどうしたらいいのかな?無謀にも現在の/usr/bin/docker.ioに差し替えて動かしてみました。
$ sudo service docker.io stop $ sudo mv /usr/bin/docker.io /usr/bin/docker.io.org $ sudo cp bundles/1.0.1/binary/docker-1.0.1 /usr/bin/docker.io $ sudo service docker.io start
バージョンを確認。
$ docker version Client version: 1.0.1 Client API version: 1.12 Go version (client): go1.2.1 Git commit (client): 990021a Server version: 1.0.1 Server API version: 1.12 Go version (server): go1.2.1 Git commit (server): 990021a
動いているようです。docker run なども問題なく動きました。
試行錯誤してやってみましたが、その後でビルド方法のドキュメントを見つけました。
http://docs.docker.com/contributing/devenvironment/
DockerをビルドするのにまずDockerをインストールしろと書いてあります。
不思議な話ですが、これによって誰がビルドしてもOSとかツールチェインとかライブラリのバージョンの違いによるトラブルが発生することがありません。これからのOSSのソースリポジトリにはそのビルド環境構築のためのDockerfileがついてくるのが当たり前になるかもしれません。
ちなみに初回のビルドにはビルド用のコンテナの作成のためにそれなりの時間がかかりましたが、2回目以降はコンテナの作成がうまい具合にcacheされるのであっという間にビルドが完了します。
2回目のビルドのログ
apt-get install とかgit cloneとかの実行がなんでcacheできるのかとても不思議で魔法のようです。
なお、make cross とすると、linux/amd64の他に以下の7種類のdockerがビルドされます。
そのうちlinux/armのdockerを試してみよう。