设为首页 收藏本站
查看: 1009|回复: 0

[经验分享] docker 源码分析client1

[复制链接]

尚未签到

发表于 2017-12-6 17:40:15 | 显示全部楼层 |阅读模式
  网上搜到的源码分析对应版本太老,Docker的main函数不是位于./docker/docker/docker.go,之能自己研究
  当前版本的client 和 deamon 的main函数虽然都是在cmd目录下但是分开的
  client位于/cmd/docker/docker.go,deamon位于/cmd/dockerd/docker.go
  分析client端,有几个库包需要先了解一下
  "github.com/Sirupsen/logrus"  结构化的log 库
  "github.com/spf13/cobra"  Cobra 是命令行的库
    "github.com/spf13/pflag"   用于替换go 自带的flag包
  回到main函数,就是创建cli->创建cmd->执行cmd
  func main() {
    stdin, stdout, stderr := term.StdStreams()
    dockerCli := command.NewDockerCli(stdin, stdout, stderr)
    cmd := newDockerCommand(dockerCli)
    err := cmd.Execute()
  .....
}
  最关键部分就是 newDockerCommand 函数,创建cobra.command
  func newDockerCommand(dockerCli *command.DockerCli) *cobra.Command {
    opts := cliflags.NewClientOptions()   //  cli/flags/client.go创建一个clientoption
    var flags *pflag.FlagSet

    cmd := &cobra.Command{  //cobra/command.go
        Use:              "docker [OPTIONS] COMMAND [ARG...]",
        Short:            "A self-sufficient runtime for containers",
        SilenceUsage:     true,
        SilenceErrors:    true,
        TraverseChildren: true,
        Args:             noArgs,
        RunE: func(cmd *cobra.Command, args []string) error {  //Run but returns an error
            if opts.Version {
                showVersion()
                return nil
            }
            return dockerCli.ShowHelp(cmd, args)
        },
        PersistentPreRunE: func(cmd *cobra.Command, args []string) error {//children of this command will inherit and execute
            // daemon command is special, we redirect directly to another binary
            if cmd.Name() == "daemon" {
                return nil
            }
            // flags must be the top-level command flags, not cmd.Flags()
            opts.Common.SetDefaultOptions(flags)    //  cli/flags/common.go  设置一些默认参数
            dockerPreRun(opts)   //参数的一些设置
            if err := dockerCli.Initialize(opts); err != nil {  //cli/command/cli.go  设置cli的一些参数 .docker/config.json
                return err
            }
            return isSupported(cmd, dockerCli.Client().ClientVersion(), dockerCli.HasExperimental()) //命令是否支持
        },
    }
    cli.SetupRootCommand(cmd)  //cli/cobra.go  根命令增加help和errfunc

    flags = cmd.Flags()   //cobra/command.go  返回FlagSet,如果commod里面没有FlagSet就创建一个
    flags.BoolVarP(&opts.Version, "version", "v", false, "Print version information and quit")
    flags.StringVar(&opts.ConfigDir, "config", cliconfig.Dir(), "Location of client config files")
    opts.Common.InstallFlags(flags)   //  cli/flags/common.go  增加flags

    setFlagErrorFunc(dockerCli, cmd, flags, opts) //设置这2个func
    setHelpFunc(dockerCli, cmd, flags, opts)

    cmd.SetOutput(dockerCli.Out())
    cmd.AddCommand(newDaemonCommand())  //把daemon的cmd作为子命令增加
    commands.AddCommands(cmd, dockerCli)  // cli/command/commands/commands.go 增加commond目录下所有的命令

    setValidateArgs(dockerCli, cmd, flags, opts)

    return cmd
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421399-1-1.html 上篇帖子: windows安装docker 下篇帖子: Docker实战之创建一个tomcat容器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表