121 lines
3.3 KiB
Python
121 lines
3.3 KiB
Python
import docker
|
|
import os
|
|
import getpass
|
|
import logging
|
|
|
|
_image = "dokoliho/botserver"
|
|
_uid = os.getuid()
|
|
_username = getpass.getuser()
|
|
_containername = "botserver_" + _username
|
|
_port = 62187 + _uid
|
|
_logger = logging.getLogger(__name__)
|
|
_from_env=False
|
|
_verbose=False
|
|
|
|
def _client():
|
|
if _from_env:
|
|
client = docker.from_env()
|
|
else:
|
|
client = docker.DockerClient(base_url='tcp://172.17.0.1:2375')
|
|
return client
|
|
|
|
def _get_running_container():
|
|
client = _client()
|
|
try:
|
|
return client.containers.get(_containername)
|
|
except:
|
|
msg = f"Container {_containername} not found."
|
|
if _verbose: print(msg)
|
|
_logger.info(msg)
|
|
return None
|
|
|
|
def connect_remote_daemon(flag):
|
|
global _from_env
|
|
_from_env = not flag
|
|
|
|
def stop_container():
|
|
container = _get_running_container()
|
|
if container is not None:
|
|
container.stop()
|
|
container.remove()
|
|
msg = f"Container {_containername} stopped."
|
|
if _verbose: print(msg)
|
|
_logger.info(msg)
|
|
|
|
def start_container(verbose=False):
|
|
global _verbose
|
|
_verbose = verbose
|
|
stop_container()
|
|
client = _client()
|
|
try:
|
|
client.containers.run(_image,
|
|
command=["sleep", "inf"],
|
|
detach=True,
|
|
name=_containername,
|
|
ports={63187: _port})
|
|
msg = f"Container {_containername} started with port {_port}"
|
|
if _verbose: print(msg)
|
|
_logger.info(msg)
|
|
return _port
|
|
except Exception as e:
|
|
if _verbose: print(str(e))
|
|
_logger.warning(str(e))
|
|
return None
|
|
|
|
def exec_in_container(command):
|
|
container = _get_running_container()
|
|
if container == None:
|
|
msg = f"Container {_containername} not running."
|
|
_logger.warning(msg)
|
|
raise Exception(msg)
|
|
try:
|
|
msg = f"Executing {command}"
|
|
if _verbose: print(msg)
|
|
_logger.info(msg)
|
|
result = container.exec_run(command, stream=True)
|
|
except Exception as e:
|
|
print(str(e))
|
|
_logger.warning(str(e))
|
|
return
|
|
for line in result.output:
|
|
print(line.decode("utf-8"))
|
|
msg = f"Execution of {command} finished."
|
|
if _verbose: print(msg)
|
|
_logger.info(msg)
|
|
|
|
def exec_synced_in_container(command):
|
|
container = _get_running_container()
|
|
if container == None:
|
|
msg = f"Container {_containername} not running."
|
|
_logger.warning(msg)
|
|
raise Exception(msg)
|
|
try:
|
|
msg = f"Executing (sync) {command}"
|
|
if _verbose: print(msg)
|
|
_logger.info(msg)
|
|
exit_code, output = container.exec_run(command)
|
|
except Exception as e:
|
|
print(str(e))
|
|
return
|
|
print(output.decode("utf-8") )
|
|
msg = f"Execution of {command} finished."
|
|
if _verbose: print(msg)
|
|
_logger.info(msg)
|
|
|
|
def print_logs():
|
|
container = _get_running_container()
|
|
if container == None:
|
|
msg = f"Container {_containername} not running."
|
|
_logger.warning(msg)
|
|
raise Exception(msg)
|
|
print(container.logs().decode("utf-8"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
connect_remote_daemon(False)
|
|
start_container(verbose=True)
|
|
# exec_in_container("echo 'hello world'")
|
|
exec_in_container("/bots/server/bots training")
|
|
stop_container()
|
|
|