95 lines
3.4 KiB
Python
95 lines
3.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# in prod-salt-01 ,run start ,bound,remove docker ,get gz file from 10.10.2.3
|
|
from fabric import Connection
|
|
import os
|
|
import pdb
|
|
|
|
|
|
#todo :remove dock image && docker
|
|
class DeployDocker:
|
|
|
|
def __init__(self) -> None:
|
|
self.target = os.path.abspath('.').split('/')[-1].strip()
|
|
self.image_name = f"{self.target.split('.')[0]}:{'.'.join(self.target.split('.')[1:])}"
|
|
self.hostip = '10.10.2.3'
|
|
self.remote_base_dir = "/tmp/miles"
|
|
self.base_image = "k_ub20:v1"
|
|
self.remote_dir = f"{self.remote_base_dir}/{self.target}"
|
|
self.user = "root"
|
|
self.docker_files = "Dockerfile"
|
|
|
|
def _check_result(self, data):
|
|
if data.exited == 0:
|
|
print(f"run {data.command} Success!\n{data.stdout.strip()}")
|
|
return True
|
|
else:
|
|
print(
|
|
f"run {data.command} Failed!\n{data.stdout.strip()}\t{data.stderr.strip()}"
|
|
)
|
|
return False
|
|
|
|
def _pre_start(self):
|
|
sync_cmd = f"rsync -av ../{self.target} root@{self.hostip}:{self.remote_base_dir}"
|
|
with Connection(host=self.hostip, user=self.user) as c:
|
|
result = c.local(sync_cmd)
|
|
assert result.exited == 0
|
|
return True
|
|
|
|
def _build_docker(self):
|
|
with Connection(host=self.hostip, user=self.user) as c:
|
|
|
|
cmd = f"cd {self.remote_dir} && docker build -t {self.image_name} -f {self.docker_files} ."
|
|
result = c.run(cmd)
|
|
assert result.exited == 0
|
|
#self._check_result(result)
|
|
return True
|
|
|
|
def _run_docker(self):
|
|
with Connection(host=self.hostip, user=self.user) as c:
|
|
#pdb.set_trace()
|
|
run_docker = f"docker run -d {self.image_name} bash"
|
|
result = c.run(run_docker)
|
|
assert result.exited == 0
|
|
find_docker = f"docker ps -a --filter ancestor={self.image_name}"
|
|
result_find = c.run(find_docker).stdout.strip()
|
|
container_id = result_find.split('\n')[-1].split(" ")[0]
|
|
assert container_id
|
|
get_gz_cmd = f"docker cp {container_id}:/app/target/app.tar.gz {self.remote_dir}/app.tar.gz"
|
|
result_get_docker = c.run(get_gz_cmd)
|
|
assert result_get_docker.exited == 0
|
|
remote_file = f"{self.remote_dir}/app.tar.gz"
|
|
local_file = f"./target/{self.target}.tar.gz"
|
|
result_get_remote = c.local(
|
|
f"rsync root@{self.hostip}:/{remote_file} {local_file}")
|
|
assert result_get_remote.exited == 0
|
|
self._clean()
|
|
return True
|
|
|
|
def _clean(self):
|
|
with Connection(host=self.hostip, user=self.user) as c:
|
|
find_docker = f"docker ps -a --filter ancestor={self.image_name}"
|
|
result_find = c.run(find_docker).stdout.strip()
|
|
container_id = result_find.split('\n')[-1].split(" ")[0]
|
|
assert container_id
|
|
remove_docker = f"docker stop {container_id} && docker rm {container_id} &&docker image rm {self.image_name}"
|
|
return True
|
|
|
|
def _start(self):
|
|
if self._build_docker():
|
|
if self._run_docker():
|
|
return True
|
|
else:
|
|
self._clean()
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
def run(self):
|
|
if self._pre_start():
|
|
if self._start():
|
|
return True
|
|
|
|
|
|
if __name__ == "__main__":
|
|
dd = DeployDocker()
|
|
dd.run() |