会社の手元マシンにも自宅の手元マシンにもVirtualBoxを入れているんですが、気づけばVirtualBoxの中にいるVMはいずれも一つだけになっていた。
その正体はdocker-machineのboot2docker。結局dockerだけで済むから他にVMなんて作る必要はなかったんだ。
確かに、時にはdockerではどうにもならないこともあって、vagrant使うこともあるんだけどね。でも大抵はdockerでどうにかなる範囲なんだわ。boot2dockerは割と良くできていると思う。他にもRancherOSとかその他いろいろと競合はあると思いますが、まあ簡単だし、そこはあんまり重要じゃないところ。VirtualBoxである必然性もなくなっている。
dockerイメージはalpine無双の時代が長かったですが、そろそろ過ぎつつあるのかな。自分は今でもdebian:jessieとかubuntuとかcentos:centos7とかopensuseとか使うことが多いですけど、今のメインストリームは、成果物のバイナリのみを/に置いてentrypointにする、というもの。あと必要であればroot CAの証明書も配置する。busyboxもshもない。scratchからCOPYで置く。確かにそれが最強だよな…
今だと別の場所でビルドしてgithubあたりにリリースファイルを置いて、ADDでダウンロードすることになるのかな。ただ、今度からはDockerfileの中でビルドして、結果だけを別イメージに置く、みたいな書き方をしやすいDockerfileになるらしいです。
Golangはその点、そういう感じでビルドしやすいようにできている。前段のビルドで1個のバイナリを作って、後段でそのバイナリを配置する、という。javaやrubyやnodejsとかだとそうは行かない。処理系もそうだし、依存するライブラリのファイルも配置していく必要があって、なかなか大変だ。Rubyのbundlerやnodejsのpackage.jsonも良くできていると思ったけど、不完全だったんだなぁ。Rubyやnodejsでも、処理系や依存パッケージまでまとめて一つの実行ファイルを作る感じのビルドができるように、いずれはなるのかもしれない。