Docker0.10読み(2回目)
Golang Cafe#27に参加してきました。
今日のお題は、Dockerコード読みです。
~/docker/docker/docker.go のクライアント部分から、~/docker/api/client/commands.goの func CmdRun()を上から読んでいきます。
golang初心者として書き方の勉強になったこと。
- 最初の行で、
config, hostConfig, cmd, err := runconfig.ParseSubcommand(cli.Subcmd("run", "[OPTIONS] IMAGE [COMMAND] [ARG...]", "Run a command in a new container"), args, nil)
変数の型を宣言しないで使っていいこと。このあたりはLLっぽい。
- エラー処理にはdeferを使う
defer func() { if cidFileInfo, err = os.Stat(hostConfig.ContainerIDFile); err != nil { return } }()
無名関数なので最後に ()を忘れないこと。deferはいくつでもスタックできる。return時にLIFOで実行される。
- 並列実行の方法
waitDisplayId = make(chan struct{}) go func() { defer close(waitDisplayId) fmt.Fprintf(cli.out, "%s\n", runResult.Get("Id")) }()
- チャネル変数(並列動作するプロセス間で使う変数)はmakeで宣言する。
- go func() で並列実行する。
このあたりが、golang初心者には、目新しかったです。
とりあえず、小並感で。
ubuntu14.04TLSは2年ぶりということで、こっちも貼っておきます。