- Docker源碼分析
- 孫宏亮
- 535字
- 2018-12-31 20:27:03
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:]…)。
- 軟件工程基礎教程
- 軟件需求與可視化模型(微軟技術叢書)
- iOS App界面設計創意與實踐
- 深度學習訓練營 21天實戰TensorFlow+Keras+scikit-learn
- Docker源碼分析
- 用戶體驗四維度
- 軟件測試面試突擊:為自己贏得一份測試工程師職位
- Arduino項目開發:智能家居
- 解決方案架構師修煉之道(原書第2版)
- 深入淺出數據結構與算法(微課視頻版)
- Visual Basic編程寶典(十年典藏版)
- 云原生Kubernetes全棧架構師實戰
- R實戰:系統發育樹的數據集成操作及可視化
- Intel Quartus Prime數字系統設計權威指南:從數字邏輯、Verilog HDL 到復雜數字系統的實現
- 云原生應用構建:基于OpenShift