def load_full_image(): '''Create image object from test image and return the object''' test_image = DockerImage(docker.get_dockerfile_image_tag()) try: test_image.load_image() except NameError as error: test_image.origins.add_notice_to_origins(test_image.repotag, Notice(str(error), 'error')) except subprocess.CalledProcessError as error: test_image.origins.add_notice_to_origins( test_image.repotag, Notice(str(error.output, 'utf-8'), 'error')) except IOError as error: test_image.origins.add_notice_to_origins(test_image.repotag, Notice(str(error), 'error')) return test_image
def execute_dockerfile(args): '''Execution path if given a dockerfile''' check_docker_daemon() logger.debug('Setting up...') setup(dockerfile=args.dockerfile) # attempt to build the image logger.debug('Building Docker image...') # placeholder to check if we can analyze the full image completed = True build, msg = docker.is_build() if build: # attempt to get built image metadata image_tag_string = docker.get_dockerfile_image_tag() full_image = load_full_image(image_tag_string) if full_image.origins.is_empty(): # image loading was successful # Add an image origin here full_image.origins.add_notice_origin( formats.dockerfile_image.format(dockerfile=args.dockerfile)) # analyze image analyze_docker_image(full_image, True) else: # we cannot load the full image logger.warning('Cannot retrieve full image metadata') completed = False # clean up image container.remove_image(full_image.repotag) if not args.keep_working_dir: clean_image_tars(full_image) else: # cannot build the image logger.warning('Cannot build image') completed = False # check if we have analyzed the full image or not if not completed: # get the base image logger.debug('Loading base image...') base_image = load_base_image() if base_image.origins.is_empty(): # image loading was successful # add a notice stating failure to build image base_image.origins.add_notice_to_origins( args.dockerfile, Notice( formats.image_build_failure, 'warning')) # analyze image analyze_docker_image(base_image) else: # we cannot load the base image logger.warning('Cannot retrieve base image metadata') # run through commands in the Dockerfile logger.debug('Parsing Dockerfile to generate report...') stub_image = get_dockerfile_packages() # clean up image container.remove_image(base_image.repotag) if not args.keep_working_dir: clean_image_tars(base_image) # generate report based on what images were created if completed: generate_report(args, full_image) else: generate_report(args, base_image, stub_image) logger.debug('Teardown...') teardown() if not args.keep_working_dir: shutil.rmtree(os.path.abspath(constants.temp_folder))