diff --git a/bake/compose.go b/bake/compose.go index 720df547113..6036e53473a 100644 --- a/bake/compose.go +++ b/bake/compose.go @@ -8,6 +8,7 @@ import ( "sort" "strings" + "github.com/compose-spec/compose-go/v2/consts" "github.com/compose-spec/compose-go/v2/dotenv" "github.com/compose-spec/compose-go/v2/loader" composetypes "github.com/compose-spec/compose-go/v2/types" @@ -40,7 +41,11 @@ func ParseCompose(cfgs []composetypes.ConfigFile, envs map[string]string) (*Conf ConfigFiles: cfgs, Environment: envs, }, func(options *loader.Options) { - options.SetProjectName("bake", false) + projectName := "bake" + if v, ok := envs[consts.ComposeProjectName]; ok && v != "" { + projectName = v + } + options.SetProjectName(projectName, false) options.SkipNormalization = true options.Profiles = []string{"*"} }) diff --git a/bake/compose_test.go b/bake/compose_test.go index d45327c1204..28541095f48 100644 --- a/bake/compose_test.go +++ b/bake/compose_test.go @@ -771,6 +771,33 @@ services: require.NoError(t, err) } +func TestProjectName(t *testing.T) { + var dt = []byte(` +services: + scratch: + build: + context: ./webapp + args: + PROJECT_NAME: ${COMPOSE_PROJECT_NAME} +`) + + t.Run("default", func(t *testing.T) { + c, err := ParseCompose([]composetypes.ConfigFile{{Content: dt}}, nil) + require.NoError(t, err) + require.Len(t, c.Targets, 1) + require.Len(t, c.Targets[0].Args, 1) + require.Equal(t, map[string]*string{"PROJECT_NAME": ptrstr("bake")}, c.Targets[0].Args) + }) + + t.Run("env", func(t *testing.T) { + c, err := ParseCompose([]composetypes.ConfigFile{{Content: dt}}, map[string]string{"COMPOSE_PROJECT_NAME": "foo"}) + require.NoError(t, err) + require.Len(t, c.Targets, 1) + require.Len(t, c.Targets[0].Args, 1) + require.Equal(t, map[string]*string{"PROJECT_NAME": ptrstr("foo")}, c.Targets[0].Args) + }) +} + // chdir changes the current working directory to the named directory, // and then restore the original working directory at the end of the test. func chdir(t *testing.T, dir string) {