diff --git a/frontend/dockerfile/dockerfile_secrets_test.go b/frontend/dockerfile/dockerfile_secrets_test.go index e8c1634373dd..519d7bd91e8f 100644 --- a/frontend/dockerfile/dockerfile_secrets_test.go +++ b/frontend/dockerfile/dockerfile_secrets_test.go @@ -15,6 +15,7 @@ import ( var secretsTests = []integration.Test{ testSecretFileParams, + testSecretRequiredWithoutValue, } func init() { @@ -51,3 +52,31 @@ RUN [ ! -f /mysecret ] # check no stub left behind }, nil) require.NoError(t, err) } + +func testSecretRequiredWithoutValue(t *testing.T, sb integration.Sandbox) { + f := getFrontend(t, sb) + + dockerfile := []byte(` +FROM busybox +RUN --mount=type=secret,required,id=mysecret foo +`) + + dir, err := tmpdir( + fstest.CreateFile("Dockerfile", dockerfile, 0600), + ) + require.NoError(t, err) + defer os.RemoveAll(dir) + + c, err := client.New(sb.Context(), sb.Address()) + require.NoError(t, err) + defer c.Close() + + _, err = f.Solve(sb.Context(), c, client.SolveOpt{ + LocalDirs: map[string]string{ + builder.DefaultLocalNameDockerfile: dir, + builder.DefaultLocalNameContext: dir, + }, + }, nil) + require.Error(t, err) + require.Contains(t, err.Error(), "secret mysecret: not found") +} diff --git a/frontend/dockerfile/instructions/commands_runmount.go b/frontend/dockerfile/instructions/commands_runmount.go index 0431a3d8a231..f32b72489deb 100644 --- a/frontend/dockerfile/instructions/commands_runmount.go +++ b/frontend/dockerfile/instructions/commands_runmount.go @@ -147,6 +147,9 @@ func parseMount(value string, expander SingleWordExpander) (*Mount, error) { key := strings.ToLower(parts[0]) if len(parts) == 1 { + if expander == nil { + continue // evaluate later + } switch key { case "readonly", "ro": m.ReadOnly = true