土曜のもくもくで着手しかけてたメモをもうすこしすすめてみます。
ソース取得
以下にて。
$ git clone https://github.com/dotcloud/docker.git
HEAD は 48982679 になってます。
掘削開始
始点は docker/docker.go です。
見てみたところ
- utils.SelfPath() の戻りに “.dockerinit” を含んでいる場合
- Enable daemon mode な -d あるいは –daemon オプション指定の場合
- それ以外
という形に見えます。
.dockerinit とは
ちょっとよく分からない。どう見ても docker なパスに .dockerinit が含まれてる場合、に見えます。その場合
sysinit.SysInit()
が呼び出されてます。このあたり、別途確認かなと。
とりあえず
それ以外、のナニを確認してみます。いっちゃん末端部分ですが以下。
if err := cli.ParseCommands(flag.Args()...); err != nil {
cli は client.DockerCli のポインタな模様。直上に以下な式が書いてあります。
if *flTls || *flTlsVerify {
cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], &tlsConfig)
} else {
cli = client.NewDockerCli(os.Stdin, os.Stdout, os.Stderr, protoAddrParts[0], protoAddrParts[1], nil)
}
client は api/client なのか。cli.go を見れば良いのかどうか。
func NewDockerCli(in io.ReadCloser, out, err io.Writer, proto, addr string, tlsConfig *tls.Config) *DockerCli {
client.DockerCli は直下で定義されてて以下?
type DockerCli struct {
proto string
addr string
configFile *registry.ConfigFile
in io.ReadCloser
out io.Writer
err io.Writer
isTerminal bool
terminalFd uintptr
tlsConfig *tls.Config
scheme string
}
で、ParseCommands の中身が以下らしい。
func (cli *DockerCli) ParseCommands(args ...string) error {
if len(args) > 0 {
method, exists := cli.getMethod(args[0])
if !exists {
fmt.Println("Error: Command not found:", args[0])
return cli.CmdHelp(args[1:]...)
}
return method(args[1:]...)
}
return cli.CmdHelp(args...)
}
ある意味そのまんまですね。つうか lxc はどこいった。とりあえず getMethod 見てみます。
func (cli *DockerCli) getMethod(name string) (func(...string) error, bool) {
if len(name) == 0 {
return nil, false
}
methodName := "Cmd" + strings.ToUpper(name[:1]) + strings.ToLower(name[1:])
method := reflect.ValueOf(cli).MethodByName(methodName)
if !method.IsValid() {
return nil, false
}
return method.Interface().(func(...string) error), true
}
戻すのは手続きオブジェクトと bool になっている模様。
その後
色々見てるなかで lxc はスデに使われていないことを知りました。daemon な記述も以下に控えておきたいと思います。
- engine.New() している
- goroutine を kickoff して eng.Job(“initserver”) なオブジェクトを初期設定
- 初期設定したオブジェクトを Run (goroutine の中)
- もう一つ eng.Job(“acceptconnections”).Run() している (goroutine の中)
- goroutine の kickoff 元で eng.Job(“serveapi”) を Run している
TODO
以下なのかどうか。
- engine/engine.go あたりを始点に daemon な動作について確認
- DockerCli とは何かを確認
あとは Github から取得したソレを動かしてみたいんですが、どうすりゃいいのやら。これはこれで継続課題ということで。。