Docker CLI插件是当前主流且受支持的插件类型,通过命名如docker-<subcommand>的可执行文件扩展命令行功能,需存于$PATH或~/.docker/cli-plugins/并手动处理上下文与配置。

开发 DockerClient 自定义插件,本质是通过 Docker Engine 的 插件机制(Plugin API) 扩展 CLI 行为或后端能力,但需注意:Docker 官方自 20.10 起已弃用传统插件系统(基于 Unix socket + manifest.json 的 v1 插件),转而推荐使用 CLI 插件(CLI Plugins) —— 即独立可执行文件,由 docker CLI 自动发现并调用。
明确插件类型:CLI 插件 vs 旧式引擎插件
当前主流且受支持的是 CLI 插件,它不修改 Docker daemon,只扩展 docker 命令行。例如运行 docker hello(若存在 docker-hello 可执行文件)。
-
CLI 插件:Go/Python/Shell 编写的二进制或脚本,命名形如
docker-<subcommand>,放在$PATH或~/.docker/cli-plugins/ - 旧式引擎插件(已弃用):需注册到 daemon、实现 /Plugin.Activate 等 HTTP 接口,仅适用于极老版本(≤19.03),不建议新项目采用
开发标准 CLI 插件的四步流程
以添加 docker whoami 为例(输出当前 Docker 上下文用户与 registry 认证信息):
-
命名与存放:创建可执行文件
docker-whoami,确保有执行权限(chmod +x),放入~/.docker/cli-plugins/或系统$PATH -
解析参数:插件接收 CLI 参数(如
docker whoami --format json),自行处理 flag 和 args,无需依赖 Docker SDK -
复用 Docker 配置:读取
~/.docker/config.json获取 auths、current-context;调用docker context inspect或DOCKER_HOST环境变量判断连接目标 - 输出兼容格式:返回结构化 JSON 或清晰文本,保持与原生命令风格一致(如错误时 exit 1 并打印 stderr)
增强能力:结合 Docker SDK 或 CLI 内部逻辑
插件本身是独立进程,但可通过标准方式与 Docker 交互:
- 执行子命令:
exec.Command("docker", "info").Output()(Go)或subprocess.run(["docker", "ps"], capture_output=True)(Python) - 调用 Docker API:
http://localhost:2375/containers/json(需启用 DOCKER_HOST,注意 TLS 和权限) - 复用 Go CLI 工具链:参考 docker/cli 仓库中的
cli/command包,导入github.com/docker/cli/cli/command等模块做配置解析、客户端初始化
调试与分发建议
CLI 插件调试简单,但易忽略环境一致性:
- 在插件开头加
echo "DEBUG: $@"或日志输出,确认参数传递是否符合预期 - 用
docker-cli-plugin list(需安装 docker-cli-plugin 工具)验证发现状态 - 分发时提供跨平台二进制(Go 编译多目标)、shell wrapper(适配不同 shell 的 tab 补全)、README.md 说明安装路径与权限要求
不复杂但容易忽略:CLI 插件不自动继承 docker CLI 的上下文切换逻辑,需主动读取 DOCKER_CONTEXT 或 docker context show 结果,否则可能连错 daemon。










