Porting Docker to FreeBSD

about 1 year ago • written in Japanese

Docker Meetup Tokyo #3 で “Porting Docker to FreeBSD” という題でライトニングトークしてきました。時間配分はうまくいかず最後のほうが駆け足になりつつも、話自体はそれなりにうけたみたいでよかったです。

スライドは Speaker Deck にアップロード しましたが、スライドだけを読んでもそんなにわかることもないのでいくつか補足。

結局 FreeBSD で動くの?

いろいろ とりこまれてデーモンとしての Docker Engine も起動はするようになりましたが、まだ execdriver という、肝心の jail を使う予定のところがとりこまれていません。kzys/docker に execdriver-jail というブランチ があり、ここに jail をつかう差分 と、まだマージされていない例えば #6759 あたりがはいっているので、試したい場合はこちらからどうぞ。

jail をつかった execdriver がとりこまれたら、ZFS をつかった graphdriver を書いて、その後にネットワークのところをやりたいと思っています。

Go の悪口ってなに?

“return err” って結構デバッグむずかしくない? という話をするつもりでした。以前にも書いた のですが、Docker Engine には パーミッションの 0600 と書くところが 600 になっていた というバグがあって、結果として

...
--- FAIL: TestLookupImage (0.01 seconds)
        tags_unit_test.go:59: mkdir /tmp/docker-teste5d2-tRunner-474736604/vfs/dir/foo/etc/postgres: permission denied
FAIL
exit status 1
FAIL    github.com/dotcloud/docker/graph        0.021s

Tests failed: ./graph



Test failures in: ./graph

% 

「/tmp にパーミッション? ugo+w じゃないの?」という感じでテストが失敗していました。Java や Ruby だと、こういう場合にスタックトレースつきの例外が飛んでくるので、最終的にだれが mkdir してるのがすぐ見つけられます。

ところが Docker Engine の場合、tags_unit_test.go の59行目のエラーは Graph#Register の結果で、ということで実装を読んでみると4カ所で return err していてどこからきているかわからなくて、どこかつきとめたら Image#StoreImage っぽいので実装を読んでみるとこれが11カ所で return err していて、どこかつきとめると archive.ApplyLayer で、たしかにここで os.Mkdir していたね、みたいなことを自分でやらないといけません。

自分が Go をつかうとしたら、github.com/juju/errgo あたりをつかうと思うのですが、Go の人々はこういう自作 err があるものなのか、デバッガがあればうまくいく話なのか、でも本番を考えるとロギングでどうこうすべきなのか、おすすめがあればぜひ教えてほしいです。

Docker Engine の移植とかしないので…

ですよねー。冗談なんですが、イベントにカジュアルって題をつけてあえて前提知識の必要な話をするような、「え〜!普通だと思ってた」みたいな嫌感があったなあと後から思いました。