#26を開催しました。T.YokoyamaのブログGDG中国のオーガナイザーのブログ。Google技術のネタや読書記録、たまに日常のことなど。#26を開催しました。#26を開催しました。今回からdockerのソースコードを読み進めることになりましたので、”当然”main()から読み進めるのが妥当だろうということでmain()が書かれているdocker/docker.goから読み始めました。modeでの起動ということで、sysinit.Sysinit()が呼び出されます。パスに".dockerinit"が含まれる時ということなので、docker自身が隠しディレクトリを作る事があるのだと思いますが、sysinitは少し重たそうだったので、少しだけ見て、先に進むことにしました。sysinitパッケージは後日に回します。dockerは引数、オプションを扱うflagパッケージを自作しているようで、別名でflagパッケージを定義してありました。"github.com/dotcloud/docker/pkg/mflag"使っている所をみると、オプションを配列で指定することができるようにしてあるだけのようにも見えますが、とりあえずは最初の起動の処理をみるということにして、flagも存在だけのチェックで終わっています。それぞれの引数がどのような意味なのかは、mflagパッケージを読む時にじっくり見たいと思います。デフォルトコメントが書かれているので、そこから判断して頂いてもいいかと思います。処理の流れとしては、versionフラグがtrueの時、version情報を出力して終了Hosts(?)の長さが0(指定されていない時)に環境変数DOCKER_HOSTを取得DOCKER_HOSTが未定義または、Daemonとして動作する時はデフォルトのUnixSocketを保持する。ちなみに、デフォルトのUnixSocketのパスは/var/run/docker.sockなので、Macだと存在しないと怒られて動作しないので、-HオプションでSocketを指定する。-bと--bipオプションが両方指定してあるとエラーになる。-Dか--debugオプションが指定してある場合は、環境変数DEBUGを1にする。-dか--daemonオプションが指定されているとDaemonモードで動作する。※こちらは今回読んでいないので、中身はまだわかりません。XXXとかで動かすモード)の処理TLSを使うかどうかのチェックclient.NewDockerCli()を呼び出し、clientオブジェクトを取得TLSを使うかどうかの違いは最後の引数がnilか、configが指定してあるかの違い。ParseCommands()でコマンドの解析とサブコマンドの実行が行われる。解析だけかと思ったら実行もされていた。Importsを使ったパッケージの初期化処理が便利だということと、strings.SplitN()を使って、最大N個までの分割で済ませるというAPIがあることが、新たな発見でした。Importsはsql/driverあたりでも使われるのですが、その時は、interfaceのみだから、interfaceを認識させるために使うと思っていましたが、init()関数が呼び出されることで、ドライバの初期化ができるというのは、初期化処理の呼び出しをいちいち書かなくても良いという点でいい発見でした。(使う時があるかどうかは別にして...)次回はdockerのサブコマンドである、apiパッケージを読み進めたいと思います。#27を開催しました。#26を開催しました。#25を開催しました。#24を開催しました。#23を開催しました。