From 70f08221a3e6a86334f866223628c0b628bb369d Mon Sep 17 00:00:00 2001 From: Daniel Radetsky Date: Thu, 25 Aug 2022 14:56:04 -0700 Subject: [PATCH 1/3] feat: disable cache-copy-layers in multistage builds; closes 2065 --- pkg/dockerfile/dockerfile.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/dockerfile/dockerfile.go b/pkg/dockerfile/dockerfile.go index 9dd56a7900..6cf434f0c2 100644 --- a/pkg/dockerfile/dockerfile.go +++ b/pkg/dockerfile/dockerfile.go @@ -58,6 +58,10 @@ func ParseStages(opts *config.KanikoOptions) ([]instructions.Stage, []instructio return nil, nil, errors.Wrap(err, "parsing dockerfile") } + if opts.CacheCopyLayers && len(stages) >= 2 { + return nil, nil, errors.New("kaniko does not support caching copy layers in multistage builds") + } + metaArgs, err = expandNested(metaArgs, opts.BuildArgs) if err != nil { return nil, nil, errors.Wrap(err, "expanding meta ARGs") From ef3148a8699077e8f2be2b8f6520cb5295fca694 Mon Sep 17 00:00:00 2001 From: Daniel Radetsky Date: Thu, 25 Aug 2022 15:13:29 -0700 Subject: [PATCH 2/3] test --- pkg/dockerfile/dockerfile_test.go | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/pkg/dockerfile/dockerfile_test.go b/pkg/dockerfile/dockerfile_test.go index f613986896..819928f4f3 100644 --- a/pkg/dockerfile/dockerfile_test.go +++ b/pkg/dockerfile/dockerfile_test.go @@ -29,6 +29,39 @@ import ( "github.com/moby/buildkit/frontend/dockerfile/instructions" ) +func Test_ParseStages_NoMultistageWithCacheCopy(t *testing.T) { + dockerfile := ` + FROM scratch as first + COPY testfile / + + FROM scratch as second + COPY --from=second testfile / + ` + tmpfile, err := ioutil.TempFile("", "Dockerfile.test") + if err != nil { + t.Fatal(err) + } + + defer os.Remove(tmpfile.Name()) + + if _, err := tmpfile.Write([]byte(dockerfile)); err != nil { + t.Fatal(err) + } + if err := tmpfile.Close(); err != nil { + t.Fatal(err) + } + + opts := &config.KanikoOptions{ + DockerfilePath: tmpfile.Name(), + CacheCopyLayers: true, + } + + _, _, err = ParseStages(opts) + if err == nil { + t.Fatal("expected ParseStages to fail on MultiStage build if CacheCopyLayers=true") + } +} + func Test_ParseStages_ArgValueWithQuotes(t *testing.T) { dockerfile := ` ARG IMAGE="ubuntu:16.04" From 8e85e02761989f92ddbb373bf43e43e7cc637035 Mon Sep 17 00:00:00 2001 From: Daniel Radetsky Date: Thu, 25 Aug 2022 15:30:24 -0700 Subject: [PATCH 3/3] fmt --- pkg/dockerfile/dockerfile_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/dockerfile/dockerfile_test.go b/pkg/dockerfile/dockerfile_test.go index 819928f4f3..4e251f319c 100644 --- a/pkg/dockerfile/dockerfile_test.go +++ b/pkg/dockerfile/dockerfile_test.go @@ -52,7 +52,7 @@ func Test_ParseStages_NoMultistageWithCacheCopy(t *testing.T) { } opts := &config.KanikoOptions{ - DockerfilePath: tmpfile.Name(), + DockerfilePath: tmpfile.Name(), CacheCopyLayers: true, }