Skip to content

Commit 62ba6fe

Browse files
authored
Merge pull request moby#5150 from tonistiigi/dockerfile-no-stage-error
dockerfile: avoid frontend panic when no stages defined
2 parents 2a78bd3 + 262634c commit 62ba6fe

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

frontend/dockerfile/dockerfile2llb/convert.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
258258
if err != nil {
259259
return nil, err
260260
}
261+
if len(stages) == 0 {
262+
return nil, errors.New("dockerfile contains no stages to build")
263+
}
261264
validateStageNames(stages, lint)
262265

263266
shlex := shell.NewLex(dockerfile.EscapeToken)

frontend/dockerfile/dockerfile_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ var allTests = integration.TestFuncs(
196196
testInvalidJSONCommands,
197197
testHistoryError,
198198
testHistoryFinalizeTrace,
199+
testEmptyStages,
199200
)
200201

201202
// Tests that depend on the `security.*` entitlements
@@ -5479,6 +5480,40 @@ RUN echo $(hostname) | grep foo
54795480
}
54805481
}
54815482

5483+
func testEmptyStages(t *testing.T, sb integration.Sandbox) {
5484+
integration.SkipOnPlatform(t, "windows")
5485+
f := getFrontend(t, sb)
5486+
dockerfile := []byte(`
5487+
ARG foo=bar
5488+
`)
5489+
5490+
dir := integration.Tmpdir(
5491+
t,
5492+
fstest.CreateFile("Dockerfile", dockerfile, 0600),
5493+
)
5494+
5495+
c, err := client.New(sb.Context(), sb.Address())
5496+
require.NoError(t, err)
5497+
defer c.Close()
5498+
5499+
destDir := t.TempDir()
5500+
5501+
_, err = f.Solve(sb.Context(), c, client.SolveOpt{
5502+
LocalMounts: map[string]fsutil.FS{
5503+
dockerui.DefaultLocalNameDockerfile: dir,
5504+
dockerui.DefaultLocalNameContext: dir,
5505+
},
5506+
Exports: []client.ExportEntry{
5507+
{
5508+
Type: client.ExporterLocal,
5509+
OutputDir: destDir,
5510+
},
5511+
},
5512+
}, nil)
5513+
require.Error(t, err)
5514+
require.Contains(t, err.Error(), "dockerfile contains no stages to build")
5515+
}
5516+
54825517
func testShmSize(t *testing.T, sb integration.Sandbox) {
54835518
integration.SkipOnPlatform(t, "windows")
54845519
f := getFrontend(t, sb)

0 commit comments

Comments
 (0)