docker 源码分析daemon1

daomon 的main函数位于 cmd/dockerd/docker.go

整个文件都比较简单

func main() {
    if reexec.Init() {  //pkg/reexec/reexec.go   如果注册过initializer,则调用返回true,直接return,这里是false
        return
    }

    // Set terminal emulation based on platform as required.
    _, stdout, stderr := term.StdStreams()
    logrus.SetOutput(stderr)

    cmd := newDaemonCommand()   //新建一个cobra.command
    cmd.SetOutput(stdout)
    if err := cmd.Execute(); err != nil {   //执行
        fmt.Fprintf(stderr, "%s\n", err)
        os.Exit(1)
    }
}


func newDaemonCommand() *cobra.Command {
    opts := daemonOptions{   //  新建 daemon的配置选项
        daemonConfig: config.New(),
        common:       cliflags.NewCommonOptions(),
    }

    cmd := &cobra.Command{   // 新建 一个 cobra.command
        Use:           "dockerd [OPTIONS]",
        Short:         "A self-sufficient runtime for containers.",
        SilenceUsage:  true,
        SilenceErrors: true,
        Args:          cli.NoArgs,
        RunE: func(cmd *cobra.Command, args []string) error {
            opts.flags = cmd.Flags()
            return runDaemon(opts)   // 执行函数为 runDaemon
        },
    }
    cli.SetupRootCommand(cmd)  // cli/cobra.go  同client 设置根命令

    flags := cmd.Flags()  // 新建一个flag
    flags.BoolVarP(&opts.version, "version", "v", false, "Print version information and quit")
    flags.StringVar(&opts.configFile, flagDaemonConfigFile, defaultDaemonConfigFile, "Daemon configuration file")
    opts.common.InstallFlags(flags)  //  cli/flags/common.go  同上,设置CommonOptions 里面的flag
    installConfigFlags(opts.daemonConfig, flags)  // 设置 daemonConfig 里面的flag
    installServiceFlags(flags)   //  设置 service相关的flag

    return cmd
}

与client不同的是daemon 的函数是区分操作系统的,runDaemon 下一节再分享

posted on 2017-03-19 13:03  arwen_spy  阅读(276)  评论(0编辑  收藏  举报

导航