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
}