|
@@ -28,6 +28,27 @@ def get_ports(container):
|
28
|
28
|
return ports
|
29
|
29
|
|
30
|
30
|
|
|
31
|
+def add_containers(infos):
|
|
32
|
+ global containers, label_index, network_index
|
|
33
|
+ for info in infos:
|
|
34
|
+ container = {
|
|
35
|
+ 'image': info['Image'],
|
|
36
|
+ 'labels': info['Labels'],
|
|
37
|
+ 'net': {
|
|
38
|
+ 'addr': get_addresses(info),
|
|
39
|
+ 'ports': get_ports(info)
|
|
40
|
+ }
|
|
41
|
+ }
|
|
42
|
+
|
|
43
|
+ name = info['Names'][0][1:]
|
|
44
|
+ containers[name] = container
|
|
45
|
+
|
|
46
|
+ for k, v in container['labels'].items():
|
|
47
|
+ label_index[k][name] = v
|
|
48
|
+ for k, v in container['net']['addr'].items():
|
|
49
|
+ network_index[k][name] = v
|
|
50
|
+
|
|
51
|
+
|
31
|
52
|
parser = argparse.ArgumentParser()
|
32
|
53
|
parser.add_argument('--name', help='Name of this docker host', default='unknown')
|
33
|
54
|
parser.add_argument('--etcd-port', type=int, help='Port to connect to etcd on', default=2379)
|
|
@@ -39,25 +60,13 @@ docker_client = docker.Client(base_url='unix://var/run/docker.sock')
|
39
|
60
|
etcd_client = etcd.Client(host=args.etcd_host, port=args.etcd_port)
|
40
|
61
|
prefix = args.etcd_prefix
|
41
|
62
|
|
|
63
|
+event_gen = docker_client.events(decode=True, filters={'type': 'container', 'event': ['die', 'start']})
|
|
64
|
+
|
42
|
65
|
containers = {}
|
43
|
66
|
label_index = defaultdict(dict)
|
44
|
67
|
network_index = defaultdict(dict)
|
45
|
68
|
|
46
|
|
-for container in docker_client.containers():
|
47
|
|
- containers[container['Names'][0][1:]] = {
|
48
|
|
- 'image': container['Image'],
|
49
|
|
- 'labels': container['Labels'],
|
50
|
|
- 'net': {
|
51
|
|
- 'addr': get_addresses(container),
|
52
|
|
- 'ports': get_ports(container)
|
53
|
|
- }
|
54
|
|
- }
|
55
|
|
-
|
56
|
|
-for name, details in containers.items():
|
57
|
|
- for k, v in details['labels'].items():
|
58
|
|
- label_index[k][name] = v
|
59
|
|
- for k, v in details['net']['addr'].items():
|
60
|
|
- network_index[k][name] = v
|
|
69
|
+add_containers(docker_client.containers())
|
61
|
70
|
|
62
|
71
|
try:
|
63
|
72
|
etcd_client.delete(prefix, recursive=True)
|
|
@@ -68,6 +77,12 @@ etcd_put(etcd_client, prefix + '/containers', containers)
|
68
|
77
|
etcd_put(etcd_client, prefix + '/labels', label_index)
|
69
|
78
|
etcd_put(etcd_client, prefix + '/networks', network_index)
|
70
|
79
|
|
71
|
|
-print(containers)
|
72
|
|
-print(label_index)
|
73
|
|
-print(network_index)
|
|
80
|
+for event in event_gen:
|
|
81
|
+ if event['Action'] == 'start':
|
|
82
|
+ print('New container %s' % event['id'])
|
|
83
|
+ add_containers(docker_client.containers(filters={'id': event['id']}))
|
|
84
|
+ elif event['Action'] == 'die':
|
|
85
|
+ print('Dead container %s' % event['id'])
|
|
86
|
+ else:
|
|
87
|
+ print('Unexpected event %s' % event['Action'])
|
|
88
|
+
|