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() 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)
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