forked from aws/amazon-vpc-cni-k8s
/
docker.go
91 lines (72 loc) · 2.25 KB
/
docker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package docker
import (
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"golang.org/x/net/context"
"github.com/pkg/errors"
log "github.com/cihub/seelog"
)
// ContainerInfo provides container information
type ContainerInfo struct {
ID string
Name string
K8SUID string
}
// APIs provides Docker API
type APIs interface {
GetRunningContainers() (map[string]*ContainerInfo, error)
}
type Client struct{}
func New() *Client {
return &Client{}
}
func (c *Client) GetRunningContainers() (map[string]*ContainerInfo, error) {
var containerInfos = make(map[string]*ContainerInfo)
cli, err := client.NewEnvClient()
if err != nil {
return nil, err
}
defer cli.Close()
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
return nil, err
}
for _, container := range containers {
log.Infof("GetRunningContainers: Discovered running docker: %s %s %s State: %s Status: %s ",
container.ID, container.Names[0], container.Labels["io.kubernetes.pod.uid"], container.State, container.Status)
containerType, ok := container.Labels["io.kubernetes.docker.type"]
if !ok {
log.Infof("GetRunningContainers: skip non pause container")
continue
}
if containerType != "podsandbox" {
log.Infof("GetRunningContainers: skip container type: %s", containerType)
continue
}
log.Debugf("GetRunningContainers: containerType %s", containerType)
if container.State != "running" {
log.Infof("GetRunningContainers: skip container who is not running")
continue
}
uid := container.Labels["io.kubernetes.pod.uid"]
_, ok = containerInfos[uid]
if !ok {
containerInfos[uid] = &ContainerInfo{
ID: container.ID,
Name: container.Names[0],
K8SUID: uid}
continue
}
if container.Names[0] != containerInfos[uid].Name {
log.Infof("GetRunningContainers: same uid matched by container:%s, %s container id %s",
containerInfos[uid].Name, container.Names[0], container.ID)
continue
}
if container.Names[0] == containerInfos[uid].Name {
log.Errorf("GetRunningContainers: Conflict container id %s for container %s",
container.ID, containerInfos[uid].Name)
return nil, errors.New("conflict docker runtime info")
}
}
return containerInfos, nil
}