From 3dcac1b906e8001945456e3c4aace22790c8b4f4 Mon Sep 17 00:00:00 2001 From: Lukasz Jakimczuk Date: Thu, 12 Mar 2020 22:23:54 +0100 Subject: [PATCH 1/2] Resolving nested meta ARGs against themselves and build ARGs --- pkg/dockerfile/dockerfile.go | 24 ++++++++++++++++++++++++ pkg/dockerfile/dockerfile_test.go | 7 +++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/pkg/dockerfile/dockerfile.go b/pkg/dockerfile/dockerfile.go index 5ca8f1eea..777178f0c 100644 --- a/pkg/dockerfile/dockerfile.go +++ b/pkg/dockerfile/dockerfile.go @@ -58,6 +58,11 @@ func ParseStages(opts *config.KanikoOptions) ([]instructions.Stage, []instructio return nil, nil, errors.Wrap(err, "parsing dockerfile") } + metaArgs, err = expandNested(metaArgs, opts.BuildArgs) + if err != nil { + return nil, nil, errors.Wrap(err, "expanding meta ARGs") + } + return stages, metaArgs, nil } @@ -97,6 +102,25 @@ func Parse(b []byte) ([]instructions.Stage, []instructions.ArgCommand, error) { return stages, metaArgs, nil } +// expandNestedArgs tries to resolve nested ARG value against the previously defined ARGs +func expandNested(metaArgs []instructions.ArgCommand, buildArgs []string) ([]instructions.ArgCommand, error) { + prevArgs := make([]string, 0) + for i := range metaArgs { + arg := metaArgs[i] + v := arg.Value + if v != nil { + val, err := util.ResolveEnvironmentReplacement(*v, append(prevArgs, buildArgs...), false) + if err != nil { + return nil, err + } + prevArgs = append(prevArgs, arg.Key+"="+val) + arg.Value = &val + metaArgs[i] = arg + } + } + return metaArgs, nil +} + // stripEnclosingQuotes removes quotes enclosing the value of each instructions.ArgCommand in a slice // if the quotes are escaped it leaves them func stripEnclosingQuotes(metaArgs []instructions.ArgCommand) ([]instructions.ArgCommand, error) { diff --git a/pkg/dockerfile/dockerfile_test.go b/pkg/dockerfile/dockerfile_test.go index 63c66f4b2..39204139b 100644 --- a/pkg/dockerfile/dockerfile_test.go +++ b/pkg/dockerfile/dockerfile_test.go @@ -33,6 +33,9 @@ func Test_ParseStages_ArgValueWithQuotes(t *testing.T) { dockerfile := ` ARG IMAGE="ubuntu:16.04" ARG FOO=bar + ARG HELLO="Hello" + ARG WORLD="World" + ARG NESTED="$HELLO $WORLD" FROM ${IMAGE} RUN echo hi > /hi @@ -65,11 +68,11 @@ func Test_ParseStages_ArgValueWithQuotes(t *testing.T) { t.Fatal("length of stages expected to be greater than zero, but was zero") } - if len(metaArgs) != 2 { + if len(metaArgs) != 5 { t.Fatalf("length of stage meta args expected to be 2, but was %d", len(metaArgs)) } - for i, expectedVal := range []string{"ubuntu:16.04", "bar"} { + for i, expectedVal := range []string{"ubuntu:16.04", "bar", "Hello", "World", "Hello World"} { if metaArgs[i].ValueString() != expectedVal { t.Fatalf("expected metaArg %d val to be %s but was %s", i, expectedVal, metaArgs[i].ValueString()) } From 8a585829b8e737f72ea2e902fb1932dff45b4318 Mon Sep 17 00:00:00 2001 From: Tejal Desai Date: Thu, 4 Jun 2020 12:28:51 -0700 Subject: [PATCH 2/2] Update pkg/dockerfile/dockerfile_test.go --- 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 39204139b..31a965241 100644 --- a/pkg/dockerfile/dockerfile_test.go +++ b/pkg/dockerfile/dockerfile_test.go @@ -69,7 +69,7 @@ func Test_ParseStages_ArgValueWithQuotes(t *testing.T) { } if len(metaArgs) != 5 { - t.Fatalf("length of stage meta args expected to be 2, but was %d", len(metaArgs)) + t.Fatalf("length of stage meta args expected to be 5, but was %d", len(metaArgs)) } for i, expectedVal := range []string{"ubuntu:16.04", "bar", "Hello", "World", "Hello World"} {