import subprocess from utils import * BASE_IMAGE_DIR = 'images' DOCKERFILES = { 'u_agent': { 'ctx': BASE_IMAGE_DIR, 'dockerfile_prefix': 'u_agent' }, 'u_server': { 'ctx': BASE_IMAGE_DIR, 'dockerfile_prefix': 'u_server' }, 'u_db': { 'ctx': BASE_IMAGE_DIR, 'dockerfile_prefix': 'u_db' }, 'tests_runner': { 'ctx': BASE_IMAGE_DIR, 'dockerfile_prefix': 'tests_runner' }, } def docker(args): try: cmd = ['docker'] + args log(f'Running docker command: {cmd}') return subprocess.check_output(cmd) except subprocess.CalledProcessError as e: err(str(e)) raise def print_errors(errors): err_msg = '\n'.join( ' {container}: {error}'.format(container=item['container'], error=item['error']) for item in errors) err('There are some errors in next containers:\n%s' % err_msg) def check_state(containers): errors = [] for container in containers: ret, out = subprocess.getstatusoutput( 'docker inspect --format \'{{ .State.Running }}\' %s' % container) out = out.strip() if ret == 0: if out == 'true': continue else: errors.append({'container': container, 'error': 'Bad state: Running=%s' % out}) else: errors.append({'container': container, 'error': out}) return errors def rebuild_images_if_needed(force_rebuild=False): for img_name, data in DOCKERFILES.items(): ctx = data['ctx'] df_prefix = data.get('dockerfile_prefix') df_suffix = 'Dockerfile' img_name = f'unki/{img_name}' log(f'Building docker image {img_name}') cmd = [ 'build', '-t', img_name, ctx, ] if df_prefix: cmd += ['-f', f'{ctx}/{df_prefix}.{df_suffix}'] if force_rebuild: cmd += ['--no-cache'] docker(cmd)