def get_or_create_model_container()

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