docker 代码阅读之路 -- docker cli 组件
docker cli 组件
docker 在主要的组件有cli、server、register、image、container 等,其中 cli 便是 docker 的客户端的。它的源代码也即 docker/cli 目录下,主要用于解析用户通过 “docker” 命令行的操作。
编译使用
通过以下步骤可以单独编译 cli 组件。
-
首先下载 cli 源码,docker 相关的组件被整理到了 git clone https://github.com/docker/ 下,其中包括 cli 部分的源代码。
cd $GOPATH/src/github.com/docker/cli/cmd/docker git clone https://github.com/docker/cli.git
-
进入 docker cli 组件的入口目录
cd cli/cmd/docker
-
编译(需要 golang 环境,这里使用最新版本 golang 1.11 进行编译)
go build .
将在目录下生成 docker 二进制文件,可以直接运行。若本机已经安装过 docker 并启动了 server, 则可以用该二进制文件操作本机的 docker 服务。
-
使用编译出的命令行工具
./docker --help
Cobra 命令行库
如果直接看 cli 的代码,可能并不简单。这里首先了解下 Cobra 的使用,可以帮助更快了解 docker cli 的源码结构。
cobra 是 golang 语言中一个命令行库,用 cobra 可以快速的构建命令行及对应的执行函数。 kubernetes 、 etcd 、 docker 、OpenShift 等工具都用它构建命令行。
它的源代码在 https://github.com/spf13/cobra。
下面是用 cobra 构建一个命令行的例子。
-
安装 cobra
go get -v github.com/spf13/cobra/cobra
-
使用 cobra 创建一个 demo
cobra init demo
-
自动生成了代码,目录结构如下
demo ▾ cmd/ root.go main.go
-
如下所示
cli 目录结构分析
接下来,看看 docker/cli 的目录结构,根目录下的文件、目录可以首先了解 cli 和 cmd 目录,其中 cmd 目录是入口代码的目录,熟悉 golang 的一定不陌生,而 cmd 便包含大量使用 cobra 库构建的子命令。
├── appveyor.yml
├── AUTHORS
├── circle.yml
├── cli
├── cmd
├── codecov.yml
├── contrib
├── CONTRIBUTING.md
├── dockerfiles
├── docker.Makefile
├── docs
├── e2e
├── experimental
├── gometalinter.json
├── internal
├── Jenkinsfile
├── kubernetes
├── LICENSE
├── MAINTAINERS
├── Makefile
├── man
├── NOTICE
├── opts
├── poule.yml
├── README.md
├── scripts
├── serv