Docker Client Container List Labels
Query and control Docker containers with the Go SDK, filtering by labels, streaming events, and reporting runtime stats.
Code
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
}Report a problem with this exampleOpens a pre-filled issue on GitHub.