diff --git a/bake/bake.go b/bake/bake.go index e50fda4dc..2ccb66e95 100644 --- a/bake/bake.go +++ b/bake/bake.go @@ -449,8 +449,7 @@ func (t *Target) rebaseContextPaths() { t.Context = &contextPath } } else if t.hasDefaultContextBase { - contextPath := rebaseContextPath(t.defaultContextBase, ".") - t.Context = &contextPath + t.useDefaultContextBase = true } for k, v := range t.Contexts { if base, ok := t.contextsBase[k]; ok { @@ -755,6 +754,9 @@ func (c Config) ResolveTarget(name string, overrides map[string]map[string]Overr t.Inherits = nil if t.Context == nil { s := "." + if t.useDefaultContextBase { + s = rebaseContextPath(t.defaultContextBase, ".") + } t.Context = &s } if t.Dockerfile == nil || (t.Dockerfile != nil && *t.Dockerfile == "") { @@ -849,6 +851,7 @@ type Target struct { defaultContextBase string hasDefaultContextBase bool + useDefaultContextBase bool contextBase string hasContextBase bool contextsBase map[string]string @@ -973,6 +976,7 @@ func (t *Target) Merge(t2 *Target) { if t2.hasDefaultContextBase { t.defaultContextBase = t2.defaultContextBase t.hasDefaultContextBase = true + t.useDefaultContextBase = t2.useDefaultContextBase } if t2.Context != nil { t.Context = t2.Context diff --git a/bake/bake_test.go b/bake/bake_test.go index 3e3b516b1..49cd0e242 100644 --- a/bake/bake_test.go +++ b/bake/bake_test.go @@ -869,6 +869,55 @@ target "other" { require.Equal(t, filepath.ToSlash(filepath.Clean("two")), *m["other"].Context) } +func TestInheritedContextRebase(t *testing.T) { + t.Run("same file", func(t *testing.T) { + fp := File{ + Name: filepath.Join("subdir", "docker-bake.hcl"), + Data: []byte(` +target "base" { + context = "basectx" +} + +target "app" { + inherits = ["base"] + tags = ["app:latest"] +}`), + } + + m, _, err := ReadTargets(context.TODO(), []File{fp}, []string{"app"}, nil, nil, nil, &EntitlementConf{}, ParseOpt{ + FileRelativePaths: true, + }) + require.NoError(t, err) + + require.Equal(t, filepath.ToSlash(filepath.Clean("subdir/basectx")), *m["app"].Context) + }) + + t.Run("cross file", func(t *testing.T) { + fp1 := File{ + Name: filepath.Join("one", "docker-bake.hcl"), + Data: []byte(` +target "base" { + context = "basectx" +}`), + } + fp2 := File{ + Name: filepath.Join("two", "docker-bake.hcl"), + Data: []byte(` +target "app" { + inherits = ["base"] + tags = ["app:latest"] +}`), + } + + m, _, err := ReadTargets(context.TODO(), []File{fp1, fp2}, []string{"app"}, nil, nil, nil, &EntitlementConf{}, ParseOpt{ + FileRelativePaths: true, + }) + require.NoError(t, err) + + require.Equal(t, filepath.ToSlash(filepath.Clean("one/basectx")), *m["app"].Context) + }) +} + func TestOverridesNotRebased(t *testing.T) { fp := File{ Name: filepath.Join("subdir", "docker-bake.hcl"),