diff --git a/bake/compose.go b/bake/compose.go index 5b0dea123811..75b911695d28 100644 --- a/bake/compose.go +++ b/bake/compose.go @@ -242,6 +242,9 @@ func loadComposeFiles(cfgs []composetypes.ConfigFile, envs map[string]string, op filtered[key] = v } } + if len(filtered) == 0 { + return nil, errors.New("empty compose file") + } if err := composeschema.Validate(filtered); err != nil { return nil, err diff --git a/bake/compose_test.go b/bake/compose_test.go index 018ed6434ff3..437fbe800cf5 100644 --- a/bake/compose_test.go +++ b/bake/compose_test.go @@ -611,6 +611,7 @@ func TestValidateComposeFile(t *testing.T) { fn string dt []byte isCompose bool + wantErr bool }{ { name: "empty service", @@ -620,6 +621,7 @@ services: foo: `), isCompose: true, + wantErr: false, }, { name: "build", @@ -630,6 +632,7 @@ services: build: . `), isCompose: true, + wantErr: false, }, { name: "image", @@ -640,6 +643,7 @@ services: image: nginx `), isCompose: true, + wantErr: false, }, { name: "unknown ext", @@ -650,6 +654,7 @@ services: image: nginx `), isCompose: true, + wantErr: false, }, { name: "hcl", @@ -660,13 +665,64 @@ target "default" { } `), isCompose: false, + wantErr: false, + }, + { + name: "json", + fn: "docker-bake.json", + dt: []byte(` +{ + "group": [ + { + "targets": [ + "my-service" + ] + } + ], + "target": [ + { + "context": ".", + "dockerfile": "Dockerfile" + } + ] +} +`), + isCompose: false, + wantErr: false, + }, + { + name: "json unknown ext", + fn: "docker-bake.foo", + dt: []byte(` +{ + "group": [ + { + "targets": [ + "my-service" + ] + } + ], + "target": [ + { + "context": ".", + "dockerfile": "Dockerfile" + } + ] +} +`), + isCompose: false, + wantErr: true, }, } for _, tt := range cases { t.Run(tt.name, func(t *testing.T) { isCompose, err := validateComposeFile(tt.dt, tt.fn) assert.Equal(t, tt.isCompose, isCompose) - require.NoError(t, err) + if tt.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + } }) } } @@ -913,6 +969,14 @@ services: require.ErrorContains(t, err, `additional properties 'foo' not allowed`) } +func TestEmptyComposeFile(t *testing.T) { + tmpdir := t.TempDir() + chdir(t, tmpdir) + _, err := ParseComposeFiles([]File{{Name: "compose.yml", Data: []byte(``)}}) + require.Error(t, err) + require.ErrorContains(t, err, `empty compose file`) // https://github.com/compose-spec/compose-go/blob/a42e7579d813e64c0c1f598a666358bc0c0a0eb4/loader/loader.go#L542 +} + // 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) {