docker.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import os, io, sys, platform, shutil, time, json, datetime
  2. import re, docker, requests
  3. from api.utils import shell_execute
  4. from dotenv import load_dotenv, find_dotenv
  5. import dotenv
  6. from pathlib import Path
  7. from api.utils.common_log import myLogger
  8. def pull_images(app_name):
  9. # 备用方法
  10. # 为了防止安装前,用户服务器已经有了镜像。导致安装时镜像不重新拉取,镜像是老的(根据docker-compose.yml 和 .env 获取)
  11. myLogger.info_logger("Pull images complete ...")
  12. def delete_images(app_id):
  13. # 备用方法
  14. # 卸载APP时同时删除dockercompose里面对应的镜像(根据docker-compose.yml 和 .env 获取)
  15. myLogger.info_logger("Delete images complete ...")
  16. def get_process_perc(app_name, real_name):
  17. process_now = "step1"
  18. if if_app_exits(app_name):
  19. process_now = "step2"
  20. process_now = "step3"
  21. return process_now
  22. def if_app_exits(app_name):
  23. cmd = "docker compose ls -a | grep \'" + app_name + "\\b\'"
  24. output = shell_execute.execute_command_output_all(cmd)
  25. if int(output["code"]) == -1:
  26. return False
  27. else:
  28. return True
  29. def check_vm_resource(app_name):
  30. myLogger.info_logger("Checking virtual memory resource ...")
  31. var_path = "/data/library/apps" + app_name + "/variables.json"
  32. requirements_var = read_var(var_path, 'requirements')
  33. need_cpu_count = int(requirements_var['cpu'])
  34. cpu_count = int(shell_execute.execute_command_output_all("cat /proc/cpuinfo | grep \'core id\'| wc -l")["result"])
  35. if cpu_count < need_cpu_count:
  36. myLogger.info_logger("Check complete: The number of CPU cores is insufficient!")
  37. return False
  38. need_mem_total = int(requirements_var['memory'])
  39. mem_total = float(
  40. shell_execute.execute_command_output_all("free -m | grep Mem | awk \'{print $2}\'")["result"]) / 1024
  41. if mem_total < need_mem_total:
  42. myLogger.info_logger("Check complete: The total amount of memory is insufficient!")
  43. return False
  44. mem_free = float(
  45. shell_execute.execute_command_output_all("free -m | grep Mem | awk \'{print $4}\'")["result"]) / 1024
  46. if need_mem_total > 4 and mem_free < 4:
  47. myLogger.info_logger("Check complete: There is not enough memory left!")
  48. return False
  49. need_disk = int(requirements_var['disk'])
  50. disk_free = float(shell_execute.execute_command_output_all("df -m | awk \'$NF==\"/\"{print $4}\'")["result"]) / 1024
  51. if disk_free < need_disk:
  52. myLogger.info_logger("Check complete: There are not enough disks left!")
  53. return False
  54. myLogger.info_logger("Check complete.")
  55. return True
  56. def check_app_directory(app_name):
  57. # websoft9's support applist
  58. myLogger.info_logger("Checking dir...")
  59. path = "/data/library/apps/" + app_name
  60. is_exists = check_directory(path)
  61. return is_exists
  62. def check_directory(path):
  63. output = shell_execute.execute_command_output_all("ls " + path)
  64. if int(output["code"]) == 0:
  65. return True
  66. else:
  67. return False
  68. def check_app_compose(app_name):
  69. myLogger.info_logger("Checking port...")
  70. path = "/data/apps/" + app_name + "/.env"
  71. port_dic = read_env(path, "APP_.*_PORT")
  72. # 1.判断/data/apps/app_name/.env中的port是否占用,没有被占用,方法结束(get_start_port方法)
  73. for port_name in port_dic:
  74. port_value = get_start_port(port_dic[port_name])
  75. modify_env(path, port_name, port_value)
  76. myLogger.info_logger("Port check complete")
  77. return
  78. def check_app_url(customer_app_name):
  79. myLogger.info_logger("Checking app url...")
  80. # 如果app的.env文件中含有HTTP_URL项目,需要如此设置 HTTP_URL=ip:port
  81. env_path = "/data/apps/" + customer_app_name + "/.env"
  82. if read_env(env_path, "HTTP_URL") != {}:
  83. ip = shell_execute.execute_command_output_all("curl ifconfig.me")["result"]
  84. http_port = list(read_env(path, "APP_HTTP_PORT").values())[0]
  85. url = ip + ":" + http_port
  86. modify_env(path, "HTTP_URL", url)
  87. myLogger.info_logger("App url check complete")
  88. return
  89. def read_env(path, key):
  90. myLogger.info_logger("Read " + path)
  91. output = shell_execute.execute_command_output_all("cat " + path + "|grep " + key)
  92. code = output["code"]
  93. env_dic = {}
  94. if int(code) == 0 and output["result"] != "":
  95. ret = output["result"]
  96. env_list = ret.split()
  97. for env in env_list:
  98. env_dic[env.split("=")[0]] = env.split("=")[1]
  99. myLogger.info_logger("Read " + path + ": " + str(env_dic))
  100. return env_dic
  101. def modify_env(path, env_name, value):
  102. myLogger.info_logger("Modify " + path + "...")
  103. output = shell_execute.execute_command_output_all("sed -n \'/^" + env_name + "/=\' " + path)
  104. if int(output["code"]) == 0 and output["result"] != "":
  105. line_num = output["result"].split("\n")[0]
  106. s = env_name + "=" + value
  107. output = shell_execute.execute_command_output_all("sed -i \'" + line_num + "c " + s + "\' " + path)
  108. if int(output["code"]) == 0:
  109. myLogger.info_logger("Modify " + path + ": Change " + env_name + " to " + value)
  110. def read_var(var_path, var_name):
  111. value = "-"
  112. myLogger.info_logger("Read " + var_path)
  113. output = shell_execute.execute_command_output_all("cat " + var_path)
  114. if int(output["code"]) == 0:
  115. var = json.loads(output["result"])
  116. try:
  117. value = var[var_name]
  118. except KeyError:
  119. myLogger.warning_logger("Read " + var_path + ": No key " + var_name)
  120. else:
  121. myLogger.warning_logger(var_path + " not found")
  122. return value
  123. def get_start_port(port):
  124. use_port = port
  125. while True:
  126. cmd = "netstat -ntlp | grep -v only"
  127. output = shell_execute.execute_command_output_all(cmd)
  128. if output["result"].find(use_port) == -1:
  129. break
  130. else:
  131. use_port = str(int(use_port) + 1)
  132. return use_port