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