Docker container that lists running containers and stores information on them in etcd
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

monitor.py 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/usr/bin/env python3
  2. from collections import defaultdict
  3. import docker
  4. class Monitor:
  5. def __init__(self, host_name, on_added, on_removed):
  6. self._client = docker.Client(base_url='unix://var/run/docker.sock')
  7. self._containers = defaultdict(dict)
  8. self._host = host_name
  9. self._on_added = on_added
  10. self._on_removed = on_removed
  11. self._events = self._client.events(decode=True,
  12. filters={'type': 'container',
  13. 'event': ['die', 'start']})
  14. def monitor(self):
  15. self._add(self._client.containers())
  16. for event in self._events:
  17. if event['Action'] == 'start':
  18. print('New container %s' % event['id'])
  19. self._add(self._client.containers(filters={'id': event['id']}))
  20. elif event['Action'] == 'die':
  21. print('Dead container %s' % event['id'])
  22. else:
  23. print('Unexpected event %s' % event['Action'])
  24. def _add(self, infos):
  25. res = []
  26. for info in infos:
  27. name = info['Names'][0][1:]
  28. container = {
  29. 'host': self._host,
  30. 'image': info['Image'],
  31. 'labels': info['Labels'],
  32. 'name': name,
  33. 'net': {
  34. 'addr': self._get_addresses(info),
  35. 'ports': self._get_ports(info)
  36. }
  37. }
  38. self._containers[name] = container
  39. res.append(container)
  40. self._on_added(res)
  41. def _get_addresses(self, container):
  42. return {k: v['IPAddress'] for k, v in container['NetworkSettings']['Networks'].items()}
  43. def _get_ports(self, container):
  44. ports = defaultdict(dict)
  45. for port in container['Ports']:
  46. ports[port['Type']][port['PrivatePort']] = port['PublicPort'] if 'PublicPort' in port else 0
  47. return ports