Merge pull request #5916 from claudiubelu/windows/image-import

ctr: Fixes Windows image import
This commit is contained in:
Phil Estes 2021-09-23 15:09:34 -04:00 committed by GitHub
commit b23ec233a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -32,6 +32,7 @@ import (
"github.com/containerd/containerd/errdefs" "github.com/containerd/containerd/errdefs"
"github.com/containerd/containerd/images" "github.com/containerd/containerd/images"
"github.com/containerd/containerd/log" "github.com/containerd/containerd/log"
"github.com/containerd/containerd/platforms"
digest "github.com/opencontainers/go-digest" digest "github.com/opencontainers/go-digest"
specs "github.com/opencontainers/image-spec/specs-go" specs "github.com/opencontainers/image-spec/specs-go"
ocispec "github.com/opencontainers/image-spec/specs-go/v1" ocispec "github.com/opencontainers/image-spec/specs-go/v1"
@ -186,15 +187,25 @@ func ImportIndex(ctx context.Context, store content.Store, reader io.Reader, opt
return ocispec.Descriptor{}, errors.Wrap(err, "write docker manifest") return ocispec.Descriptor{}, errors.Wrap(err, "write docker manifest")
} }
platforms, err := images.Platforms(ctx, store, desc) imgPlatforms, err := images.Platforms(ctx, store, desc)
if err != nil { if err != nil {
return ocispec.Descriptor{}, errors.Wrap(err, "unable to resolve platform") return ocispec.Descriptor{}, errors.Wrap(err, "unable to resolve platform")
} }
if len(platforms) > 0 { if len(imgPlatforms) > 0 {
// Only one platform can be resolved from non-index manifest, // Only one platform can be resolved from non-index manifest,
// The platform can only come from the config included above, // The platform can only come from the config included above,
// if the config has no platform it can be safely omitted. // if the config has no platform it can be safely omitted.
desc.Platform = &platforms[0] desc.Platform = &imgPlatforms[0]
// If the image we've just imported is a Windows image without the OSVersion set,
// we could just assume it matches this host's OS Version. Without this, the
// children labels might not be set on the image content, leading to it being
// garbage collected, breaking the image.
// See: https://github.com/containerd/containerd/issues/5690
if desc.Platform.OS == "windows" && desc.Platform.OSVersion == "" {
platform := platforms.DefaultSpec()
desc.Platform.OSVersion = platform.OSVersion
}
} }
if len(mfst.RepoTags) == 0 { if len(mfst.RepoTags) == 0 {