func writeOutput()

in container/go/cmd/join_layers/join_layers.go [82:123]


func writeOutput(outputTarball string, tarballFormat string, tagToConfigs, tagToBaseManifests map[name.Tag]string, imageTarballs []string, layerParts []compat.LayerParts) error {
	tagToImg := make(map[name.Tag]v1.Image)
	images, err := loadImageTarballs(imageTarballs)
	if err != nil {
		return errors.Wrap(err, "unable to load images from the given tarballs")
	}
	parts := compat.ImageParts{
		Images: images,
		Layers: layerParts,
	}
	r := compat.Reader{Parts: parts}
	for tag, configFile := range tagToConfigs {
		// Manifest file may not have been specified and this is ok as it's
		// only required if the base images has foreign layers.
		manifestFile := tagToBaseManifests[tag]
		r.Parts.Config = configFile
		r.Parts.BaseManifest = manifestFile

		img, err := r.ReadImage()
		if err != nil {
			return errors.Wrapf(err, "unable to load image %v corresponding to config %s", tag, configFile)
		}
		tagToImg[tag] = img
	}
	refToImage := make(map[name.Reference]v1.Image, len(tagToImg))
	for i, d := range tagToImg {
		refToImage[i] = d
	}
	o, err := os.Create(outputTarball)
	if err != nil {
		return errors.Wrapf(err, "unable to create image tarball file %q for writing", outputTarball)
	}

	if tarballFormat == "legacy" {
		return legacyTarball.MultiWrite(refToImage, o)
	} else if tarballFormat == "compressed" {
		return tarball.MultiRefWrite(refToImage, o)
	} else {
		// TODO(#1695): Also support OCI layout?
		return errors.Errorf("invalid tarball format: %q", tarballFormat)
	}
}