in api_service/seattle_flu_incidence_mapper/query_model.py [0:0]
def get_or_create_model_container(local_job_path, host_job_path, model_id):
"""
:param job_path:
:param model_id:
:return:
"""
socket = None
created = False
try:
container = client.containers.get(f'sfim-{model_id}')
except docker.errors.NotFound:
container = None
# start container if it is not running
if container is None:
created = True
image = current_app.config['WORKER_IMAGE']
container_volumes = {
current_app.config['MODEL_HOST_PATH']: {
'bind': '/worker_model_store',
'mode': 'ro'
},
current_app.config['WORKER_JOB_HOST_PATH']: {
'bind': '/jobs',
'mode': 'rw'
}
}
container_env = dict(MODEL_STORE="/worker_model_store",
WORKER_DIR=f"/jobs/{model_id}")
current_app.logger.debug('Starting worker container for model %s', model_id)
container = client.containers.run(image,
name=f"sfim-{model_id}",
tty=True, detach=True,
environment=container_env,
volumes=container_volumes,
stdin_open=True,
auto_remove=True)
socket = container.attach_socket(params={'stdin': 1, 'stream': 1})
# initialize our model by loading
socket._sock.send(f'library(modelServR)\nmodel <- loadModelFileById("{model_id}")\n'.encode('utf-8'))
time.sleep(0.1)
# if we need to connect to an existing container, do do now
if socket is None:
current_app.logger.debug('Attaching to socket for %s', model_id)
socket = container.attach_socket(params={'stdin': 1, 'stream': 1})
return container, socket, created