Exemplo n.º 1
0
    def sync_data(self):
        """
        Synchronize data from the given base image to the target root
        directory.
        """
        if not self.unknown_uri:
            compressor = Compress(self.image_file)
            if compressor.get_format():
                compressor.uncompress(True)
                self.uncompressed_image = compressor.uncompressed_filename
            else:
                self.uncompressed_image = self.image_file
            image_uri = '{0}:{1}'.format(
                self.archive_transport, self.uncompressed_image
            )
        else:
            log.warning('Bypassing base image URI to OCI tools')
            image_uri = self.unknown_uri

        oci = OCI.new()
        oci.import_container_image(image_uri)
        oci.unpack()
        oci.import_rootfs(self.root_dir)

        # A copy of the uncompressed image and its checksum are
        # kept inside the root_dir in order to ensure the later steps
        # i.e. system create are atomic and don't need any third
        # party archive.
        image_copy = Defaults.get_imported_root_image(self.root_dir)
        Path.create(os.path.dirname(image_copy))
        oci.export_container_image(
            image_copy, 'oci-archive', Defaults.get_container_base_image_tag()
        )
        self._make_checksum(image_copy)
Exemplo n.º 2
0
    def create(self, filename, base_image):
        """
        Create compressed oci system container tar archive

        :param string filename: archive file name
        :param string base_image: archive used as a base image
        """
        exclude_list = Defaults.get_exclude_list_for_root_data_sync()
        exclude_list.append('boot')
        exclude_list.append('dev')
        exclude_list.append('sys')
        exclude_list.append('proc')

        oci = OCI()
        if base_image:
            oci.import_container_image(
                'oci-archive:{0}:{1}'.format(
                    base_image, Defaults.get_container_base_image_tag()
                )
            )
        else:
            oci.init_container()

        image_ref = '{0}:{1}'.format(
            self.oci_config['container_name'], self.oci_config['container_tag']
        )

        oci.unpack()
        oci.sync_rootfs(self.root_dir, exclude_list)
        oci.repack(self.oci_config)
        oci.set_config(self.oci_config)
        oci.post_process()

        if self.archive_transport == 'docker-archive':
            image_ref = '{0}:{1}'.format(
                self.oci_config['container_name'],
                self.oci_config['container_tag']
            )
            additional_refs = []
            if 'additional_tags' in self.oci_config:
                additional_refs = []
                for tag in self.oci_config['additional_tags']:
                    additional_refs.append('{0}:{1}'.format(
                        self.oci_config['container_name'], tag
                    ))
        else:
            image_ref = self.oci_config['container_tag']
            additional_refs = []

        oci.export_container_image(
            filename, self.archive_transport, image_ref, additional_refs
        )

        if self.runtime_config.get_container_compression():
            compressor = Compress(filename)
            return compressor.xz(self.runtime_config.get_xz_options())
        else:
            return filename
Exemplo n.º 3
0
    def create(self, filename, base_image, ensure_empty_tmpdirs=True):
        """
        Create compressed oci system container tar archive

        :param string filename: archive file name
        :param string base_image: archive used as a base image
        """
        exclude_list = Defaults.\
            get_exclude_list_for_root_data_sync(ensure_empty_tmpdirs) + Defaults.\
            get_exclude_list_from_custom_exclude_files(self.root_dir)
        exclude_list.append('dev/*')
        exclude_list.append('sys/*')
        exclude_list.append('proc/*')

        oci = OCI.new()
        if base_image:
            oci.import_container_image('oci-archive:{0}:{1}'.format(
                base_image, Defaults.get_container_base_image_tag()))
        else:
            # Apply default subcommand only for base images
            if 'entry_command' not in self.oci_config and \
                    'entry_subcommand' not in self.oci_config:
                self.oci_config['entry_subcommand'] = \
                    Defaults.get_default_container_subcommand()
            oci.init_container()

        image_ref = '{0}:{1}'.format(self.oci_config['container_name'],
                                     self.oci_config['container_tag'])

        oci.unpack()
        oci.sync_rootfs(self.root_dir, exclude_list)
        oci.repack(self.oci_config)
        oci.set_config(self.oci_config)
        oci.post_process()

        image_ref = '{0}:{1}'.format(self.oci_config['container_name'],
                                     self.oci_config['container_tag'])
        additional_refs = []
        if self.archive_transport == 'docker-archive':
            if 'additional_names' in self.oci_config:
                additional_refs = []
                for name in self.oci_config['additional_names']:
                    name_parts = name.partition(':')
                    if not name_parts[0]:
                        additional_refs.append('{0}:{1}'.format(
                            self.oci_config['container_name'], name_parts[2]))
                    elif not name_parts[2]:
                        additional_refs.append('{0}:{1}'.format(
                            name_parts[0], self.oci_config['container_tag']))
                    else:
                        additional_refs.append('{0}:{1}'.format(
                            name_parts[0], name_parts[2]))

        oci.export_container_image(filename, self.archive_transport, image_ref,
                                   additional_refs)

        return filename
Exemplo n.º 4
0
    def import_container_image(self, container_image_ref):
        """
        Imports container image reference to an OCI layout

        :param str container_image_ref: container image reference
        """
        Command.run([
            'skopeo', 'copy', container_image_ref,
            'oci:{0}:{1}'.format(self.container_dir,
                                 Defaults.get_container_base_image_tag())
        ])
Exemplo n.º 5
0
 def post_init(self):
     """
     Initializes some umoci parameters and options
     """
     self.oci_dir = mkdtemp(prefix='kiwi_oci_dir.')
     self.container_dir = os.sep.join([self.oci_dir, 'oci_layout'])
     self.working_image = '{0}:{1}'.format(
         self.container_dir, Defaults.get_container_base_image_tag())
     if CommandCapabilities.has_option_in_help('umoci', '--no-history',
                                               ['config', '--help']):
         self.no_history_flag = ['--no-history']
     else:
         self.no_history_flag = []
Exemplo n.º 6
0
    def import_container_image(self, container_image_ref):
        """
        Imports container image reference to the OCI containers storage.

        :param str container_image_ref: container image reference
        """
        if not self.imported_image:
            self.imported_image = 'kiwi-image-{0}:{1}'.format(
                self._random_string_generator(),
                Defaults.get_container_base_image_tag()
            )
        else:
            raise KiwiBuildahError(
                "Image already imported, called: '{0}'".format(
                    self.imported_image
                )
            )

        # We are making use of skopeo instead of only calling 'buildah from'
        # because we want to control the image name loaded into the containers
        # storage. This way we are certain to not leave any left over after the
        # build.
        Command.run(
            [
                'skopeo', 'copy', container_image_ref,
                'containers-storage:{0}'.format(self.imported_image)
            ]
        )

        if not self.working_container:
            self.working_container = 'kiwi-container-{0}'.format(
                self._random_string_generator()
            )
        else:
            raise KiwiBuildahError(
                "Container already initated, called: '{0}'".format(
                    self.working_container
                )
            )

        Command.run(
            [
                'buildah', 'from', '--name', self.working_container,
                'containers-storage:{0}'.format(self.imported_image)
            ]
        )