如何以Go编程方式查询Docker Client配置的容器运行时
查询Docker Client配置的容器运行时(Go语言优先实现)
一、通过Docker官方Go SDK查询Docker Daemon运行时
大多数场景下,Docker Client对接的是Docker Daemon,因此可以通过Docker SDK获取Daemon的运行时配置信息。
代码实现
package main import ( "context" "fmt" "log" "github.com/docker/docker/client" ) func main() { // 基于环境变量创建Docker客户端(自动读取DOCKER_HOST等配置) cli, err := client.NewClientWithOpts(client.FromEnv) if err != nil { log.Fatalf("创建Docker客户端失败: %v", err) } defer cli.Close() // 获取Docker Daemon的详细信息 daemonInfo, err := cli.Info(context.Background()) if err != nil { log.Fatalf("获取Daemon信息失败: %v", err) } // 输出核心运行时信息 fmt.Printf("Docker Daemon 运行时类型: %s\n", daemonInfo.RuntimeType) fmt.Printf("运行时版本: %s\n", daemonInfo.RuntimeVersion) fmt.Printf("运行时根目录: %s\n", daemonInfo.RuntimeRoot) }
关键说明
RuntimeType字段直接返回运行时类型(如containerd)RuntimeVersion和RuntimeRoot可辅助确认运行时的具体状态- 客户端会自动读取环境变量中的Docker配置,无需手动指定套接字路径
二、直接对接Containerd查询运行时
若Docker Client直接配置为使用Containerd(跳过Docker Daemon),可通过Containerd的Go SDK直接查询运行时信息。
代码实现
package main import ( "context" "fmt" "log" "github.com/containerd/containerd" "github.com/containerd/containerd/defaults" ) func main() { // 连接到本地Containerd默认套接字 ctrClient, err := containerd.New(defaults.DefaultAddress) if err != nil { log.Fatalf("连接Containerd失败: %v", err) } defer ctrClient.Close() // 获取Containerd版本信息 versionInfo, err := ctrClient.Version(context.Background()) if err != nil { log.Fatalf("获取Containerd版本失败: %v", err) } fmt.Printf("Containerd 版本: %s\n", versionInfo.Version) fmt.Printf("Containerd 修订版本: %s\n", versionInfo.Revision) // 查询所有注册的运行时处理程序 runtimeHandlers, err := ctrClient.RuntimeService().ListRuntimes(context.Background()) if err != nil { log.Fatalf("列出Containerd运行时失败: %v", err) } fmt.Println("已注册的Containerd运行时:") for _, handler := range runtimeHandlers { fmt.Printf("- 名称: %s, 路径: %s, 类型: %s\n", handler.Name, handler.Path, handler.Type) } }
关键说明
- 可直接获取Containerd的版本与运行时处理程序列表(如
io.containerd.runc.v2) - 默认连接本地套接字,若需远程连接可修改
defaults.DefaultAddress为对应地址
三、命令行方式兼容(Go中调用)
如果需要兼容无SDK依赖的场景,可在Go代码中调用系统命令获取运行时信息:
代码实现
package main import ( "fmt" "log" "os/exec" "strings" ) func getDockerRuntime() (string, error) { // 执行docker info命令提取运行时类型 cmd := exec.Command("docker", "info", "--format", "{{.RuntimeType}}") output, err := cmd.Output() if err != nil { return "", err } return strings.TrimSpace(string(output)), nil } func main() { runtimeType, err := getDockerRuntime() if err != nil { log.Fatalf("获取Docker运行时失败: %v", err) } fmt.Printf("Docker 运行时类型: %s\n", runtimeType) }
关键说明
- 依赖系统中已安装
docker或ctr命令 - 适合快速验证或兼容老旧环境
内容的提问来源于stack exchange,提问作者Nikolai Ehrhardt
相关产品推荐
相关产品推荐

