func()

in container/go/pkg/compat/reader.go [300:345]


func (r *Reader) ReadImage() (v1.Image, error) {
	// Special case: if we only have a tarball, we can instantiate the image
	// directly from that. Otherwise, we'll process the image layers
	// individually as specified in the config.
	if r.Parts.ImageTarball != "" && r.Parts.Config == "" {
		return tarball.ImageFromPath(r.Parts.ImageTarball, nil)
	}

	if r.layerLookup == nil {
		r.layerLookup = make(map[v1.Hash]v1.Layer)
	}
	if r.loadedImageCache == nil {
		r.loadedImageCache = make(map[v1.Hash]bool)
	}
	if err := r.loadMetadata(); err != nil {
		return nil, errors.Wrap(err, "unable to load image metadata")
	}
	if err := r.loadForeignLayers(); err != nil {
		return nil, errors.Wrap(err, "unable to load foreign layers specified in the base manifest")
	}
	if err := r.loadImages(r.Parts.Images); err != nil {
		return nil, errors.Wrap(err, "unable to load layers from the images in the given image parts")
	}
	if err := r.loadImgTarball(); err != nil {
		return nil, errors.Wrap(err, "unable to load layers from image tarball")
	}
	if err := r.loadLayers(); err != nil {
		return nil, errors.Wrap(err, "unable to load layers from the given parts")
	}
	layers := []v1.Layer{}
	for _, diffID := range r.config.RootFS.DiffIDs {
		layer, ok := r.layerLookup[diffID]
		if !ok {
			return nil, errors.Errorf("unable to locate layer with diffID %v as indicated in image config %s", diffID, r.Parts.Config)
		}
		layers = append(layers, layer)
	}
	img := &legacyImage{
		configPath: r.Parts.Config,
		layers:     layers,
	}
	if err := img.init(); err != nil {
		return nil, errors.Wrap(err, "unable to initialize image from parts")
	}
	return img, nil
}