ctr import: strictly match platform

Currently, ctr import will use loose matching as defined by
platforms.Only(), meaning in the case of platform linux/amd64 as in
issue#6441, importing will also match linux/386 platform on the
image-to-be-imported's index. However, that image-to-be-imported may not
have both the linux/amd64 and linux/386 platform contents, resulting in
a failure to unpack the image. This change makes that check strict such
that the requested platform to import for is the only platform content
imported. Both ctr pull and ctr export will treat the platform option as
strict, so this change makes ctr import consistent with those.

resolves #6441

Signed-off-by: Gavin Inglis <giinglis@amazon.com>
This commit is contained in:
Gavin Inglis 2022-05-06 22:26:21 +00:00
parent 459179360a
commit 2c98a7b099

View File

@ -91,7 +91,7 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
var ( var (
in = context.Args().First() in = context.Args().First()
opts []containerd.ImportOpt opts []containerd.ImportOpt
platformMacher platforms.MatchComparer platformMatcher platforms.MatchComparer
) )
prefix := context.String("base-name") prefix := context.String("base-name")
@ -126,8 +126,8 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
if err != nil { if err != nil {
return err return err
} }
platformMacher = platforms.Only(platSpec) platformMatcher = platforms.OnlyStrict(platSpec)
opts = append(opts, containerd.WithImportPlatform(platformMacher)) opts = append(opts, containerd.WithImportPlatform(platformMatcher))
} }
opts = append(opts, containerd.WithAllPlatforms(context.Bool("all-platforms"))) opts = append(opts, containerd.WithAllPlatforms(context.Bool("all-platforms")))
@ -160,10 +160,10 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
log.G(ctx).Debugf("unpacking %d images", len(imgs)) log.G(ctx).Debugf("unpacking %d images", len(imgs))
for _, img := range imgs { for _, img := range imgs {
if platformMacher == nil { // if platform not specified use default. if platformMatcher == nil { // if platform not specified use default.
platformMacher = platforms.Default() platformMatcher = platforms.Default()
} }
image := containerd.NewImageWithPlatform(client, img, platformMacher) image := containerd.NewImageWithPlatform(client, img, platformMatcher)
// TODO: Show unpack status // TODO: Show unpack status
fmt.Printf("unpacking %s (%s)...", img.Name, img.Target.Digest) fmt.Printf("unpacking %s (%s)...", img.Name, img.Target.Digest)