diff --git a/util/imagetools/create.go b/util/imagetools/create.go index 953ac9a4..3b1057bc 100644 --- a/util/imagetools/create.go +++ b/util/imagetools/create.go @@ -122,24 +122,29 @@ func (r *Resolver) Combine(ctx context.Context, srcs []*Source) ([]byte, ocispec } } - mt := images.MediaTypeDockerSchema2ManifestList //ocispec.MediaTypeImageIndex - idx := struct { - // MediaType is reserved in the OCI spec but - // excluded from go types. - MediaType string `json:"mediaType,omitempty"` - - ocispec.Index - }{ - MediaType: mt, - Index: ocispec.Index{ - Versioned: specs.Versioned{ - SchemaVersion: 2, - }, - Manifests: newDescs, - }, + dockerMfsts := 0 + for _, desc := range newDescs { + if strings.HasPrefix(desc.MediaType, "application/vnd.docker.") { + dockerMfsts++ + } } - idxBytes, err := json.MarshalIndent(idx, "", " ") + var mt string + if dockerMfsts == len(newDescs) { + // all manifests are Docker types, use Docker manifest list + mt = images.MediaTypeDockerSchema2ManifestList + } else { + // otherwise, use OCI index + mt = ocispec.MediaTypeImageIndex + } + + idxBytes, err := json.MarshalIndent(ocispec.Index{ + MediaType: mt, + Versioned: specs.Versioned{ + SchemaVersion: 2, + }, + Manifests: newDescs, + }, "", " ") if err != nil { return nil, ocispec.Descriptor{}, errors.Wrap(err, "failed to marshal index") }