/var/log/messages

debugging with sixth sense

Docker 読みかけをもう少しすすめてみる

土曜のもくもくで着手しかけてたメモをもうすこしすすめてみます。

ソース取得

以下にて。

$ 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 から取得したソレを動かしてみたいんですが、どうすりゃいいのやら。これはこれで継続課題ということで。。

Comments