From 600aa7b7a52a450fc4e1daeceea1636f43b1f6c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gronowski?= Date: Wed, 16 Aug 2023 11:16:50 +0200 Subject: [PATCH] c8d/inspect: Ignore manifest with missing config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix a failure to inspect image if any of its present manifest references an image config which isn't present locally. Signed-off-by: Paweł Gronowski (cherry picked from commit a64adda4e77890f8b126cf7a723f27735a07e5d2) Signed-off-by: Paweł Gronowski --- daemon/containerd/image.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/daemon/containerd/image.go b/daemon/containerd/image.go index 7725476d1fbd1..eaa94b8155da5 100644 --- a/daemon/containerd/image.go +++ b/daemon/containerd/image.go @@ -48,11 +48,25 @@ func (i *ImageService) GetImage(ctx context.Context, refOrID string, options ima err = i.walkImageManifests(ctx, desc, func(img *ImageManifest) error { conf, err := img.Config(ctx) if err != nil { - return err + if cerrdefs.IsNotFound(err) { + logrus.WithFields(logrus.Fields{ + "manifestDescriptor": img.Target(), + }).Debug("manifest was present, but accessing its config failed, ignoring") + return nil + } + return errdefs.System(fmt.Errorf("failed to get config descriptor: %w", err)) } + var ociimage ocispec.Image if err := readConfig(ctx, cs, conf, &ociimage); err != nil { - return err + if cerrdefs.IsNotFound(err) { + logrus.WithFields(logrus.Fields{ + "manifestDescriptor": img.Target(), + "configDescriptor": conf, + }).Debug("manifest present, but its config is missing, ignoring") + return nil + } + return errdefs.System(fmt.Errorf("failed to read config of the manifest %v: %w", img.Target().Digest, err)) } presentImages = append(presentImages, ociimage) return nil @@ -61,7 +75,8 @@ func (i *ImageService) GetImage(ctx context.Context, refOrID string, options ima return nil, err } if len(presentImages) == 0 { - return nil, errdefs.NotFound(errors.New("failed to find image manifest")) + ref, _ := reference.ParseAnyReference(refOrID) + return nil, images.ErrImageDoesNotExist{Ref: ref} } sort.SliceStable(presentImages, func(i, j int) bool {