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.

report.py 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env python3
  2. from collections import defaultdict
  3. import argparse
  4. import docker
  5. import etcd
  6. import sys
  7. def etcd_put(client, prefix, obj):
  8. for key, value in obj.items():
  9. new_prefix = "%s/%s" % (prefix, key)
  10. if isinstance(value, dict):
  11. etcd_put(client, new_prefix, value)
  12. else:
  13. client.write(new_prefix, str(value))
  14. def get_addresses(container):
  15. return {k: v['IPAddress'] for k, v in container['NetworkSettings']['Networks'].items()}
  16. def get_ports(container):
  17. ports = defaultdict(dict)
  18. for port in container['Ports']:
  19. ports[port['Type']][port['PrivatePort']] = port['PublicPort'] if 'PublicPort' in port else 0
  20. return ports
  21. parser = argparse.ArgumentParser()
  22. parser.add_argument('--name', help='Name of this docker host', default='unknown')
  23. parser.add_argument('--etcd-port', type=int, help='Port to connect to etcd on', default=2379)
  24. parser.add_argument('--etcd-host', help='Host to connect to etcd on', default='etcd')
  25. parser.add_argument('--etcd-prefix', help='Prefix to use when adding keys to etcd', default='/docker')
  26. args = parser.parse_args()
  27. docker_client = docker.Client(base_url='unix://var/run/docker.sock')
  28. etcd_client = etcd.Client(host=args.etcd_host, port=args.etcd_port)
  29. prefix = args.etcd_prefix
  30. containers = {}
  31. label_index = defaultdict(dict)
  32. network_index = defaultdict(dict)
  33. for container in docker_client.containers():
  34. containers[container['Names'][0][1:]] = {
  35. 'image': container['Image'],
  36. 'labels': container['Labels'],
  37. 'net': {
  38. 'addr': get_addresses(container),
  39. 'ports': get_ports(container)
  40. }
  41. }
  42. for name, details in containers.items():
  43. for k, v in details['labels'].items():
  44. label_index[k][name] = v
  45. for k, v in details['net']['addr'].items():
  46. network_index[k][name] = v
  47. try:
  48. etcd_client.delete(prefix, recursive=True)
  49. except etcd.EtcdKeyNotFound:
  50. pass
  51. etcd_put(etcd_client, prefix + '/containers', containers)
  52. etcd_put(etcd_client, prefix + '/labels', label_index)
  53. etcd_put(etcd_client, prefix + '/networks', network_index)
  54. print(containers)
  55. print(label_index)
  56. print(network_index)