官术网_书友最值得收藏!

2.3.1 Docker Client解析請求命令

Docker Client解析請求命令的工作,在Docker命令執行部分第一個完成。創建Docker Client之后,回到main函數中,繼續執行的源碼如下(位于./docker/docker/docker.go#L102-L110):

if err := cli.Cmd(flag.Args()...); err != nil {
     if sterr, ok := err.(*utils.StatusError); ok {
          if sterr.Status != "" {
               log.Println(sterr.Status)
          }
          os.Exit(sterr.StatusCode)
     }
     log.Fatal(err)
}

學習以上源碼可以發現,正如之前所說,Docker Client首先解析存放于flag.Args()中的具體請求參數,執行的函數為cli對象的Cmd函數。Cmd函數的定義如下(位于./docker/api/client/cli.go#L51-L61):

// Cmd executes the specified command
func (cli *DockerCli) Cmd(args ...string) error {
     if len(args) > 0 {
          method, exists := cli.getMethod(args[0])
          if !exists {
               fmt.Println("Error: Command not found:", args[0])
               return cli.CmdHelp(args[1:]...)
          }
          return method(args[1:]...)
     }
     return cli.CmdHelp(args...)
}

由代碼注釋可知,Cmd函數執行具體的指令。在源碼實現中,首先判斷請求參數列表的長度是否大于0。若長度不大于0,則說明沒有請求信息,返回docker命令的Help信息;若長度大于1,則說明有請求信息,那么Docker Client首先通過請求參數列表中的第一個元素args[0]來獲取具體的請求方法method。若上述method方法不存在,則返回docker命令的Help信息,若存在,調用具體的method方法,參數為args[1]及其之后所有的請求參數。

還是以一個具體的docker命令為例,docker--daemon=false--version=false pull Image_Name。通過以上Docker Client的分析,可以總結出以下執行流程。

1)解析flag參數之后,Docker將docker請求參數"pull"和"Image_Name"存放于flag.Args()。

2)創建好的Docker Client為cli,cli執行cli.Cmd(flag.Args()…)。

3)Cmd函數中,通過args[0]也就是"pull",執行cli.getMethod(args[0]),獲取method的名稱。

4)在getMothod方法中,Docker通過處理最終返回method值為"CmdPull"。

5)最終執行method(args[1:]…)也就是CmdPull(args[1:]…)。

主站蜘蛛池模板: 大丰市| 偏关县| 攀枝花市| 当雄县| 疏附县| 湖州市| 武夷山市| 利川市| 永平县| 潮州市| 开平市| 永胜县| 昭觉县| 醴陵市| 黄石市| 太仓市| 调兵山市| 永康市| 蛟河市| 社旗县| 石城县| 大安市| 贡觉县| 华容县| 津南区| 洪雅县| 嘉定区| 昌宁县| 当涂县| 弥渡县| 包头市| 云梦县| 临洮县| 余江县| 景德镇市| 麟游县| 闽侯县| 牡丹江市| 达州市| 东莞市| 嵩明县|