From 5bf6a27afcb100d107dc00b5258315515004ded4 Mon Sep 17 00:00:00 2001 From: Timofey Kirillov Date: Thu, 23 Mar 2023 19:09:44 +0300 Subject: [PATCH] fix(staged-dockerfile): allow scratch base image Signed-off-by: Timofey Kirillov --- pkg/build/build_phase.go | 2 +- pkg/build/image/image.go | 42 ++++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/pkg/build/build_phase.go b/pkg/build/build_phase.go index 4e07978ada..fd2ee8cc47 100644 --- a/pkg/build/build_phase.go +++ b/pkg/build/build_phase.go @@ -583,7 +583,7 @@ func (phase *BuildPhase) fetchBaseImageForStage(ctx context.Context, img *image. return phase.Conveyor.StorageManager.FetchStage(ctx, phase.Conveyor.ContainerBackend, phase.StagesIterator.PrevBuiltStage) } else { if err := img.FetchBaseImage(ctx); err != nil { - return fmt.Errorf("unable to fetch base image %s for stage %s: %w", img.GetBaseStageImage().Image.Name(), stg.LogDetailedName(), err) + return fmt.Errorf("unable to fetch base image %q for stage %s: %w", img.GetBaseStageImage().Image.Name(), stg.LogDetailedName(), err) } } return nil diff --git a/pkg/build/image/image.go b/pkg/build/image/image.go index 5c24c106c8..c045b63187 100644 --- a/pkg/build/image/image.go +++ b/pkg/build/image/image.go @@ -250,25 +250,33 @@ func (i *Image) SetupBaseImage(ctx context.Context, storageManager manager.Stora if i.IsDockerfileImage && i.DockerfileImageConfig.Staged { var info *image.Info - var err error - info, err = storageManager.GetImageInfo(ctx, i.baseImageReference, storageOpts) - if isUnsupportedMediaTypeError(err) { - if err := logboek.Context(ctx).Default().LogProcess("Pulling base image %s", i.baseStageImage.Image.Name()). - Options(func(options types.LogProcessOptionsInterface) { - options.Style(style.Highlight()) - }). - DoError(func() error { - return i.ContainerBackend.PullImageFromRegistry(ctx, i.baseStageImage.Image) - }); err != nil { - return err - } + if i.baseImageReference != "scratch" { + var err error info, err = storageManager.GetImageInfo(ctx, i.baseImageReference, storageOpts) - if err != nil { + if isUnsupportedMediaTypeError(err) { + if err := logboek.Context(ctx).Default().LogProcess("Pulling base image %s", i.baseStageImage.Image.Name()). + Options(func(options types.LogProcessOptionsInterface) { + options.Style(style.Highlight()) + }). + DoError(func() error { + return i.ContainerBackend.PullImageFromRegistry(ctx, i.baseStageImage.Image) + }); err != nil { + return err + } + + info, err = storageManager.GetImageInfo(ctx, i.baseImageReference, storageOpts) + if err != nil { + return fmt.Errorf("unable to get base image %q manifest: %w", i.baseImageReference, err) + } + } else if err != nil { return fmt.Errorf("unable to get base image %q manifest: %w", i.baseImageReference, err) } - } else if err != nil { - return fmt.Errorf("unable to get base image %q manifest: %w", i.baseImageReference, err) + } else { + info = &image.Info{ + Name: i.baseImageReference, + Env: nil, + } } i.baseStageImage.Image.SetStageDescription(&image.StageDescription{ @@ -310,6 +318,10 @@ func (i *Image) GetBaseImageReference() string { func (i *Image) FetchBaseImage(ctx context.Context) error { switch i.baseImageType { case ImageFromRegistryAsBaseImage: + if i.baseStageImage.Image.Name() == "scratch" { + return nil + } + // TODO: Refactor, move manifest fetching into SetupBaseImage, only pull image in FetchBaseImage method if info, err := i.ContainerBackend.GetImageInfo(ctx, i.baseStageImage.Image.Name(), container_backend.GetImageInfoOpts{}); err != nil {