Docker Client Container List Labels

Query and control Docker containers with the Go SDK, filtering by labels, streaming events, and reporting runtime stats.

GoCli Tooling

Code

snippet
package main

import (
	"context"
	"fmt"
	"log"
	"strings"
	"time"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/api/types/filters"
	"github.com/docker/docker/client"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	cli, err := client.NewClientWithOpts(
		client.FromEnv,
		client.WithAPIVersionNegotiation(),
	)
	if err != nil {
		log.Fatal(err)
	}
	defer cli.Close()

	// 按标签过滤:只看本工具管理的容器
	list, err := cli.ContainerList(ctx, container.ListOptions{
		All: true,
		Filters: filtersArgs("manager=deployctl"),
	})
	if err != nil {
		log.Fatal(err)
	}

	for _, c := range list {
		names := "anonymous"
		if len(c.Names) > 0 {
			names = c.Names[0]
		}
		fmt.Printf("%s state=%s image=%s\n",
			names, c.State, c.Image)

		stats, err := cli.ContainerStatsOneShot(ctx, c.ID)
		if err == nil {
			defer stats.Body.Close()
			fmt.Printf("  stats stream opened for %s\n", c.ID[:12])
		}
	}

	events, errs := cli.Events(ctx, types.EventsOptions{
		Filters: filtersArgs("type=container"),
	})
	go func() {
		for msg := range events {
			fmt.Printf("event: %s %s\n",
				msg.Action, msg.Actor.Attributes["name"])
		}
	}()
	for range errs {
		break // 演示:首个错误即退出事件循环
	}
}

func filtersArgs(pairs ...string) filters.Args {
	args := filters.NewArgs()
	for _, p := range pairs {
		kv := strings.SplitN(p, "=", 2)
		if len(kv) == 2 {
			args.Add(kv[0], kv[1])
		}
	}
	return args
}