先看docker/cmd/docker/docker.go 主要就三行 dockerCli := command.NewDockerCli(stdin, stdout, stderr) cmd := newDockerCommand(dockerCli) if err := cmd.Execute(); err != nil { NewDockerCli( 在docker/cli/command/cli.go里返回一个DockerCli实例 type DockerCli struct { configFile *configfile.ConfigFile in *InStream out *OutStream err io.Writer keyFile string client client.APIClient hasExperimental bool defaultVersion string } 设置一些client都用的些东西。初始化了in,out,err,其他字段先不管,按流程看。 newDockerCommand 先实例化一个ClientOptions, type ClientOptions struct { Common *CommonOptions ConfigDir string Version bool } 然后用了一个cobra库,应该就是管理命令行参数的。 PersistentPreRunE里边,一些参数设置。 daemon启动废弃了,所以就不设置这些参数啥的了。 opts.Common.SetDefaultOptions(flags)设置CommonOptions的一些默认参数. dockerPreRun(opts)里opts.ConfigDir可以通过设置配置文件路径,这个是默认的:configDir = os.Getenv("DOCKER_CONFIG"), 参数肯定优先级高,哈哈,SetDir会替换成参数里的。config参数的定义在newDockerCommand的最下边。 func Enable() { os.Setenv("DEBUG", "1") logrus.SetLevel(logrus.DebugLevel) } 根据参数是否开启debug dockerCli.Initialize(opts)进行dockerCli的初始化,之前只是初始化输入输出,还有其他字段要初始化。 LoadDefaultConfigFile初始化configFile字段,看名字基本就知道啥功能了。文件路径是环境变量定义的configDir = os.Getenv("DOCKER_CONFIG"),怎么load的就不看了.再往下好像是证书相关的配置需要设置参数。 NewAPIClientFromFlags(opts.Common, cli.configFile)是初始化dockerCli的client字段。具体怎么初始化的,这个等后边看。内容挺多的 cli.defaultVersion初始化另一个字段,就是client的版本.keyFile初始化, ping操作主要是获取api的版本,如果ping.APIVersion为空,就默认1.24,是1。24之前不支持这个字段,因为现在肯定大于1.24了。HasExperimental初始化 如果api版本小于客户端版本,应该是不能使用,需要把客户端版本降级。UpdateClientVersion操作。这个也后边集中分析一下。 return isSupported(cmd, dockerCli.Client().ClientVersion(), dockerCli.HasExperimental()) HasExperimental这个也是ping的时候返回的,这里主要还是版本判断,过了,cobra参数也看不太懂。 opts.Common.InstallFlags(flags)设置了一些参数,一些指定host,key,版本啥参数.与client连接server有关的设置。 cmd.AddCommand(newDaemonCommand()) 之前好像启动client和daemon是一个文件,现在分开了。这里看的是client的代码,使用之前的daemon参数进行启动的时候,提示新版本已经分开了。 commands.AddCommands(cmd, dockerCli) docker/cli/commands/commands.go 这里就是添加命令参数了。注释分类挺清楚的,分别在不同文件里边。 这个后边再细看,都差不多,命令定义都在command目录下 cmd.Execute(); 这个应该就是cobra一切设置完了 开始监听参数并执行相应方法了。

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply