diff --git a/build/opt.go b/build/opt.go index f7522fe87edd..ed9ca5a02ed3 100644 --- a/build/opt.go +++ b/build/opt.go @@ -298,7 +298,11 @@ func toSolveOpt(ctx context.Context, np *noderesolver.ResolvedNode, multiDriver } if v, ok := opt.BuildArgs["BUILDKIT_SYNTAX"]; ok { - p := strings.SplitN(strings.TrimSpace(v), " ", 2) + cmdline := strings.TrimSpace(v) + if cmdline == "" { + return nil, nil, errors.Errorf("empty BUILDKIT_SYNTAX build-arg is invalid, use --build-arg BUILDKIT_SYNTAX without '=' for optional behavior") + } + p := strings.SplitN(cmdline, " ", 2) so.Frontend = "gateway.v0" so.FrontendAttrs["source"] = p[0] so.FrontendAttrs["cmdline"] = v diff --git a/tests/build.go b/tests/build.go index 5cab893297a6..6412d2428473 100644 --- a/tests/build.go +++ b/tests/build.go @@ -62,6 +62,7 @@ var buildTests = []func(t *testing.T, sb integration.Sandbox){ testBuildProgress, testBuildAnnotations, testBuildBuildArgNoKey, + testBuildBuildKitSyntaxEmpty, testBuildLabelNoKey, testBuildCacheExportNotSupported, testBuildOCIExportNotSupported, @@ -759,6 +760,14 @@ func testBuildBuildArgNoKey(t *testing.T, sb integration.Sandbox) { require.Equal(t, `ERROR: invalid key-value pair "=TEST_STRING": empty key`, strings.TrimSpace(string(out))) } +func testBuildBuildKitSyntaxEmpty(t *testing.T, sb integration.Sandbox) { + dir := createTestProject(t) + cmd := buildxCmd(sb, withArgs("build", "--build-arg", "BUILDKIT_SYNTAX=", dir)) + out, err := cmd.CombinedOutput() + require.Error(t, err, string(out)) + require.Contains(t, string(out), `empty BUILDKIT_SYNTAX build-arg is invalid, use --build-arg BUILDKIT_SYNTAX without '=' for optional behavior`) +} + func testBuildLabelNoKey(t *testing.T, sb integration.Sandbox) { dir := createTestProject(t) cmd := buildxCmd(sb, withArgs("build", "--label", "=TEST_STRING", dir))