def get_image_state( self, source_image_target: DockerImageTarget, target_image_target: DockerImageTarget, image_info_of_dependencies: Dict[str, ImageInfo]) -> ImageState: if self.is_rebuild_necessary(image_info_of_dependencies): return ImageState.NEEDS_TO_BE_BUILD else: if target_image_target.exists() \ and not build_config().force_pull \ and not build_config().force_load: self.logger.info( f"Task {self.__repr__()}: Checking if target image {target_image_target.get_complete_name()} " f"is locally available, result {target_image_target.exists()}" ) return ImageState.TARGET_LOCALLY_AVAILABLE if source_image_target.exists() \ and not build_config().force_pull \ and not build_config().force_load: self.logger.info( f"Task {self.__repr__()}: Checking if source image {source_image_target.get_complete_name()} " f"is locally available, result {source_image_target.exists()}" ) return ImageState.SOURCE_LOCALLY_AVAILABLE elif self.can_image_be_loaded(source_image_target): return ImageState.CAN_BE_LOADED elif self.is_image_in_registry(source_image_target): return ImageState.REMOTE_AVAILABLE else: return ImageState.NEEDS_TO_BE_BUILD
class DockerImageCreatorBaseTask(StoppableTask): logger = logging.getLogger('luigi-interface') image_name = luigi.Parameter() # ParameterVisibility needs to be hidden instead of private, because otherwise a MissingParameter gets thrown image_info_json = luigi.Parameter( visibility=luigi.parameter.ParameterVisibility.HIDDEN, significant=True) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.client = docker_client_config().get_client() self.image_info = ImageInfo.from_json(self.image_info_json) self.image_target = DockerImageTarget( self.image_info.target_repository_name, self.image_info.get_target_complete_tag()) self.remove_image() def __del__(self): self.client.close() def remove_image(self): if self.image_target.exists(): self.client.images.remove( image=self.image_target.get_complete_name(), force=True) self.logger.warning("Task %s: Removed docker images %s", self.task_id, self.image_target.get_complete_name()) def output(self): return self.image_target
def is_image_locally_available(self, image_target: DockerImageTarget): exists = image_target.exists() self.logger.info( f"Task {self.__repr__()}: Checking if image {image_target.get_complete_name()} " f"is locally available, result {exists}") return exists