func()

in container/go/pkg/compat/image.go [144:192]


func (li *legacyImage) genManifest() error {
	li.manifest = &v1.Manifest{
		SchemaVersion: 2,
		MediaType:     types.DockerManifestSchema2,
		Config: v1.Descriptor{
			MediaType: types.DockerConfigJSON,
			Size:      int64(len(li.rawConfig)),
			Digest:    li.configDigest,
		},
	}
	for _, l := range li.layers {
		mediaType, err := l.MediaType()
		if err != nil {
			return errors.Wrap(err, "unable to get media type of layer")
		}
		digest, err := l.Digest()
		if err != nil {
			return errors.Wrap(err, "unable to get digest of layer")
		}
		size, err := l.Size()
		if err != nil {
			return errors.Wrap(err, "unable to get size of layer")
		}
		var urls []string
		if fl, ok := l.(*foreignLayer); ok {
			// The size returned by the Size method on foreign layers is always
			// zero. But the implementation has a private variable with the real
			// size which we need to report in the manifest.
			size = fl.size
			urls = fl.urls
		}
		li.manifest.Layers = append(li.manifest.Layers, v1.Descriptor{
			MediaType: mediaType,
			Digest:    digest,
			Size:      size,
			URLs:      urls,
		})
	}
	manifestBlob, err := json.Marshal(li.manifest)
	if err != nil {
		return errors.Wrap(err, "unable to encode generate manifest to JSON")
	}
	li.rawManifest = manifestBlob
	li.digest = v1.Hash{
		Algorithm: "sha256",
		Hex:       sha256Blob(li.rawManifest),
	}
	return nil
}