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 1.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env python3
  2. from collections import defaultdict
  3. import docker
  4. import etcd
  5. def etcd_put(client, prefix, obj):
  6. for key, value in obj.items():
  7. new_prefix = "%s/%s" % (prefix, key)
  8. if isinstance(value, dict):
  9. etcd_put(client, new_prefix, value)
  10. else:
  11. client.write(new_prefix, str(value))
  12. docker_client = docker.Client(base_url='unix://var/run/docker.sock')
  13. etcd_client = etcd.Client(host='etcd', port=4001)
  14. prefix = '/docker'
  15. containers = {}
  16. label_index = defaultdict(dict)
  17. network_index = defaultdict(dict)
  18. for container in docker_client.containers():
  19. name = container['Names'][0][1:]
  20. image = container['Image']
  21. labels = container['Labels']
  22. addrs = {}
  23. ports = defaultdict(dict)
  24. for net_name, net_config in container['NetworkSettings']['Networks'].items():
  25. addrs[net_name] = net_config['IPAddress']
  26. for port in container['Ports']:
  27. ports[port['Type']][port['PrivatePort']] = port['PublicPort'] if 'PublicPort' in port else 0
  28. containers[name] = {
  29. 'image': image,
  30. 'labels': labels,
  31. 'net': {
  32. 'addr': addrs,
  33. 'ports': ports
  34. }
  35. }
  36. for k, v in labels.items():
  37. label_index[k][name] = v
  38. for k, v in addrs.items():
  39. network_index[k][name] = v
  40. try:
  41. etcd_client.delete(prefix, recursive=True)
  42. except etcd.EtcdKeyNotFound:
  43. pass
  44. etcd_put(etcd_client, prefix + '/containers', containers)
  45. etcd_put(etcd_client, prefix + '/labels', label_index)
  46. etcd_put(etcd_client, prefix + '/networks', network_index)
  47. print(containers)
  48. print(label_index)
  49. print(network_index)