事実: Docker は自身をビルドするのに Docker を用いてコンテナ内でビルドしている
実際、ソースコード直下に、以下の Dockerfile が置いてあります。中を参照すると、ubuntu のコンテナイメージをベースに、依存するソフトウェアを apt-get したり、git clone で取得したりしています。make コマンドで、依存するソフトウェアをインストールしたコンテナ内で、hack/make.sh を実行し、バイナリを作成します。生成したバイナリをコンテナから取り出してビルド終了となります。
Docker は Golang で書かれていますが、その理由の一つに、Golang の優れたポータビリティ (libc が入っている環境であればどこでも動作するバイナリを手軽に生成できること)があります。これにより、ビルドは Docker 内の固定した環境で行い、生成したバイナリだけを取得しインストールを済ませることができるのです。
参考:Docker and Go: why did we decide to write Docker in Go?
Docker を使ったビルドの利点は、Docker さえ動く環境であれば、どこでもビルドできるため、ビルド環境の構築に手こずらなくて済むことにあります。
誰しも、ソフトウェアのビルド・インストール作業で以下のような苦い経験があるのでは無いでしょうか。
- あるソフトウェアの最新のソースコードを取得してくる
- ./configure がエラーを吐くので、エラーメッセージを参照し、依存するソフトウェアを yum install する
- まだ ./configure がエラーを吐くので、yum-builddep で依存するソフトウェアをまとめてインストールする
- まだ ./configure がエラーを吐く。yum-builddep でインストールしたソフトウェア X のバージョンが古いらしい。
- ソフトウェア X の最新バージョンをインストールすべく、1. に戻る
Docker 内ビルドが広まると、上記のような作業で手こずることは稀になることでしょう。
Docker 内ビルドの欠点としては、Golang のようにポータビリティに優れた言語を採用しないといけないこと、と、実行バイナリが大きくなってしまうことがあります。
まとめ
- Docker は自身をビルドするのに Docker を用いている
- Docker が Golang で書かれている理由に、Golang の優れたポータビリティがある
- Docker 内ビルドでビルド・インストールにかかる手間が大幅に削減出来る
余談
- Docker をビルドする Docker はどうやってビルドするのか?? 典型的なブートストラップ問題ですね。
0 件のコメント:
コメントを投稿