Skip to content

Commit 0839fa7

Browse files
Merge pull request openshift#229 from flouthoc/consider-buildinargs-userargs-from-eval
dispatcher: consider `builtinargs` and `userargs` while processing `baseImage` name
2 parents e14bee8 + c009008 commit 0839fa7

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

builder_test.go

+41
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
docker "github.com/fsouza/go-dockerclient"
1717

1818
"github.com/openshift/imagebuilder/dockerfile/parser"
19+
"github.com/containerd/containerd/platforms"
1920
)
2021

2122
func TestVolumeSet(t *testing.T) {
@@ -209,6 +210,46 @@ RUN echo $FOO $BAR`))
209210
}
210211
}
211212

213+
// Test if `FROM some-${SOME-BUILT-IN-ARG}` args gets resolved correctly.
214+
func TestArgResolutionOfDefaultVariables(t *testing.T) {
215+
// Get architecture from host
216+
var localspec = platforms.DefaultSpec()
217+
for _, tc := range []struct {
218+
dockerfile string
219+
name string
220+
args map[string]string
221+
expectedFrom string
222+
}{
223+
{name: "use-default-built-arg",
224+
dockerfile: "FROM platform-${TARGETARCH}",
225+
args: map[string]string{"FOO": "bar"},
226+
expectedFrom: "platform-" + localspec.Architecture},
227+
{name: "override-default-built-arg",
228+
dockerfile: "FROM platform-${TARGETARCH}",
229+
args: map[string]string{"TARGETARCH": "bar"},
230+
expectedFrom: "platform-bar"},
231+
{name: "random-built-arg",
232+
dockerfile: "FROM ${FOO}",
233+
args: map[string]string{"FOO": "bar"},
234+
expectedFrom: "bar"},
235+
} {
236+
t.Run(tc.name, func(t *testing.T) {
237+
n, err := ParseDockerfile(strings.NewReader(tc.dockerfile))
238+
if err != nil {
239+
t.Fatal(err)
240+
}
241+
b := NewBuilder(tc.args)
242+
from, err := b.From(n)
243+
if err != nil {
244+
t.Fatal(err)
245+
}
246+
if from != tc.expectedFrom {
247+
t.Fatalf("expected %s, got %s", tc.expectedFrom, from)
248+
}
249+
})
250+
}
251+
}
252+
212253
func resolveNodeArgs(b *Builder, node *parser.Node) error {
213254
for _, c := range node.Children {
214255
if c.Value != "arg" {

dispatchers.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,12 @@ func from(b *Builder, args []string, attributes map[string]bool, flagArgs []stri
223223
for n, v := range b.HeadingArgs {
224224
argStrs = append(argStrs, n+"="+v)
225225
}
226+
defaultArgs := envMapAsSlice(builtinBuildArgs)
227+
userArgs := mergeEnv(envMapAsSlice(b.Args), b.Env)
228+
userArgs = mergeEnv(defaultArgs, userArgs)
229+
nameArgs := mergeEnv(argStrs, userArgs)
226230
var err error
227-
if name, err = ProcessWord(name, argStrs); err != nil {
231+
if name, err = ProcessWord(name, nameArgs); err != nil {
228232
return err
229233
}
230234

@@ -234,9 +238,6 @@ func from(b *Builder, args []string, attributes map[string]bool, flagArgs []stri
234238
return fmt.Errorf("Windows does not support FROM scratch")
235239
}
236240
}
237-
defaultArgs := envMapAsSlice(builtinBuildArgs)
238-
userArgs := mergeEnv(envMapAsSlice(b.Args), b.Env)
239-
userArgs = mergeEnv(defaultArgs, userArgs)
240241
for _, a := range flagArgs {
241242
arg, err := ProcessWord(a, userArgs)
242243
if err != nil {

0 commit comments

Comments
 (0)