def run(self): dockerfile = DockerfileParser(self.workflow.builder.df_path) image_name = ImageName.parse(dockerfile.baseimage) if image_name.namespace != 'koji' or image_name.repo != 'image-build' : self.log.info('Base image not supported: %s', dockerfile.baseimage) return image_build_conf = image_name.tag or 'image-build.conf' self.session = create_koji_session(self.koji_hub, self.koji_auth_info) task_id, filesystem_regex = self.build_filesystem(image_build_conf) task = TaskWatcher(self.session, task_id, self.poll_interval) task.wait() if task.failed(): raise RuntimeError('Create filesystem task failed: {}' .format(task_id)) filesystem = self.download_filesystem(task_id, filesystem_regex) base_image = self.import_base_image(filesystem) dockerfile.baseimage = base_image return base_image
def create_context_archive(context, docker_file, base_image): original_dockerfile = open(context + '/' + docker_file, 'r') dfp = DockerfileParser() dfp.lines = original_dockerfile.readlines() original_dockerfile.close() dfp.baseimage = base_image new_file = tempfile.NamedTemporaryFile() new_file.write(dfp.content.encode('utf-8')) new_file.flush() context_archive = docker.utils.tar(context, dockerfile=docker_file) t = tarfile.open(name=context_archive.name, mode='a') t.add(new_file.name, arcname=docker_file) t.close() return context_archive
def find_templates_override(services, templates): # Template and vanilla builds involved in override tbuilds = {} vbuilds = {} for service in services: builder = service.get('build') if builder is not None: dpath = builder.get('context') dockerfile = os.path.join(os.curdir, CONTAINERS_YAML_DIRNAME, dpath) dfp = DockerfileParser(dockerfile) try: cont = dfp.content if cont is None: log.warning("Dockerfile is empty?") else: log.verbose("Parsed dockerfile {}", dpath) except FileNotFoundError as e: log.exit(e) if dfp.baseimage is None: dfp.baseimage = 'unknown_build' # elif dfp.baseimage.endswith(':template'): elif dfp.baseimage.startswith('rapydo/'): if dfp.baseimage not in templates: log.exit("""Unable to find {} in this project \nPlease inspect the FROM image in {}/Dockerfile """.format(dfp.baseimage, dockerfile)) else: vanilla_img = service.get('image') template_img = dfp.baseimage log.verbose("{} overrides {}", vanilla_img, template_img) tbuilds[template_img] = templates.get(template_img) vbuilds[vanilla_img] = template_img return tbuilds, vbuilds
# Get all versions of base image from dockerhub baseImageMatches = [] baseImageRegexC = re.compile(baseImageRegex.strip("'")) dhubTagsJson = json.loads((requests.get('https://registry.hub.docker.com/v1/repositories/' + str(dockerfileImage) + '/tags')).content) for tag in dhubTagsJson: if baseImageRegexC.search(tag["name"]): baseImageMatches.append(tag["name"]) dhubTagVersions = [parse_version(safe_version(str(tag))) for tag in baseImageMatches] dhubMaxVersion = max(dhubTagVersions) # Check base version for update if dhubMaxVersion > parse_version(str(dockerfileTag)): print("Base image has a newer version upstream: " + str(dhubMaxVersion)) dfp.baseimage = str(dockerfileImage + ':' + str(dhubMaxVersion)) updated = True elif dhubMaxVersion == parse_version(str(dockerfileTag)): print("Base image is up to date: " + str(dhubMaxVersion)) elif dhubMaxVersion < parse_version(str(dockerfileTag)): print("Base image is newer than latest release on dockerhub! Parse error? - " + str(dhubMaxVersion)) # Get all software packages present in dockerfile softwareList = list() versionDict = {} for env in dfp.envs: envsplit = env.split('_') firstPart = env.rsplit('_', 1)[0]