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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
        # 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]