docker_api.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf import settings
  4. from docker import DockerClient
  5. from docker.errors import DockerException, NotFound, APIError, ContainerError, ImageNotFound
  6. import time
  7. '''
  8. '''
  9. def get_docker_client():
  10. try:
  11. return DockerClient(base_url='unix:/%s' % settings.DOCKER_SOCK_DIR)
  12. except DockerException:
  13. return None
  14. '''
  15. '''
  16. def get_all_images():
  17. client = get_docker_client()
  18. images = []
  19. if not client:
  20. return images
  21. for image in client.images.list():
  22. images.append({
  23. 'id': image.id,
  24. 'short_id': image.short_id,
  25. 'tags': image.tags
  26. })
  27. return images
  28. '''
  29. '''
  30. def get_all_containers():
  31. client = get_docker_client()
  32. containers = []
  33. if not client:
  34. return containers
  35. for container in client.containers.list(all=True):
  36. if container.name in settings.DOCKER_FILTERS:
  37. continue
  38. containers.append({
  39. 'id': container.id,
  40. 'short_id': container.short_id,
  41. 'name': container.name,
  42. 'image': container.image,
  43. 'labels': container.labels,
  44. 'status': container.status,
  45. 'attrs': container.attrs
  46. })
  47. return containers
  48. '''
  49. '''
  50. def get_all_external_ports():
  51. ports = []
  52. for m in map(lambda x: x.get('attrs').get('NetworkSettings').get('Ports'), get_all_containers()):
  53. if not m:
  54. continue
  55. for _, v in m.iteritems():
  56. if not v:
  57. continue
  58. port = map(lambda x: x['HostPort'], v)
  59. ports.extend(port)
  60. return ports
  61. '''
  62. '''
  63. def get_network(name=None):
  64. if not name:
  65. return None
  66. client = get_docker_client()
  67. if not client:
  68. return None
  69. try:
  70. network = client.networks.get(name)
  71. return {
  72. 'id': network.id,
  73. 'short_id': network.short_id,
  74. 'name': network.name,
  75. 'attrs': network.attrs
  76. }
  77. except (NotFound, APIError):
  78. return None
  79. '''
  80. '''
  81. def get_internal_ip(container_name_or_id=None):
  82. # check name
  83. if not container_name_or_id:
  84. return None
  85. # check client
  86. client = get_docker_client()
  87. if not client:
  88. return None
  89. # check network
  90. network = get_network(settings.INTERNAL_NETWORK_NAME)
  91. if not network:
  92. return None
  93. try:
  94. container = client.containers.get(container_name_or_id)
  95. internal_ip = container.attrs.get('NetworkSettings').get('Networks').get(network.get('name')).get('IPAddress')
  96. return str(internal_ip)
  97. except (NotFound, APIError):
  98. return None
  99. '''
  100. '''
  101. def run_container(image=None, name=None, ports=[], volumes=None, net=None):
  102. if not name:
  103. return False
  104. client = get_docker_client()
  105. if not client:
  106. return False
  107. try:
  108. client.containers.run(image, None, name=name, detach=True, ports=ports, volumes=volumes, network=net)
  109. return True
  110. except (ContainerError, ImageNotFound, APIError):
  111. return False
  112. '''
  113. '''
  114. def start_container(id_or_name=None):
  115. if not id:
  116. return None
  117. client = get_docker_client()
  118. if not client:
  119. return None
  120. try:
  121. container = client.containers.get(id)
  122. container.start()
  123. time.sleep(1)
  124. container.reload()
  125. return {
  126. 'id': container.id,
  127. 'short_id': container.short_id,
  128. 'name': container.name,
  129. 'image': container.image,
  130. 'labels': container.labels,
  131. 'status': container.status
  132. }
  133. except (NotFound, APIError):
  134. return None
  135. '''
  136. '''
  137. def restart_container(id_or_name=None):
  138. if not id:
  139. return None
  140. client = get_docker_client()
  141. if not client:
  142. return None
  143. try:
  144. container = client.containers.get(id)
  145. container.restart()
  146. time.sleep(1)
  147. container.reload()
  148. return {
  149. 'id': container.id,
  150. 'short_id': container.short_id,
  151. 'name': container.name,
  152. 'image': container.image,
  153. 'labels': container.labels,
  154. 'status': container.status
  155. }
  156. except (NotFound, APIError):
  157. return None
  158. '''
  159. '''
  160. def stop_container(id=None):
  161. if not id:
  162. return None
  163. client = get_docker_client()
  164. if not client:
  165. return None
  166. try:
  167. container = client.containers.get(id)
  168. container.stop()
  169. time.sleep(1)
  170. container.reload()
  171. return {
  172. 'id': container.id,
  173. 'short_id': container.short_id,
  174. 'name': container.name,
  175. 'image': container.image,
  176. 'labels': container.labels,
  177. 'status': container.status
  178. }
  179. except (NotFound, APIError):
  180. return None
  181. '''
  182. '''
  183. def execute_command(container_id_or_name=None, command=None):
  184. if not container_id_or_name or not command:
  185. return None
  186. client = get_docker_client()
  187. if not client:
  188. return None
  189. try:
  190. container = client.containers.get(container_id_or_name)
  191. (exit_code, unused_output) = container.exec_run(command)
  192. return (False, True)[exit_code == 0]
  193. except (NotFound, APIError):
  194. return None
  195. '''
  196. '''
  197. def copy_in(container_id_or_name=None, path=None, tarfile=None):
  198. if not container_id_or_name or not path or not tarfile:
  199. return False
  200. client = get_docker_client()
  201. if not client:
  202. return False
  203. try:
  204. file = open(tarfile, 'r')
  205. container = client.containers.get(container_id_or_name)
  206. result = container.put_archive(path, file)
  207. file.close()
  208. return result
  209. except (NotFound, APIError, IOError):
  210. return False