You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:52:46