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.9KB

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