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 下一节再分享