先看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