Browse Source

Fix a rare case where using FROM scracth as NAME would fail

Signed-off-by: Daniel Nephin <dnephin@docker.com>
Daniel Nephin 8 years ago
parent
commit
28379bd29a
2 changed files with 20 additions and 3 deletions
  1. 5 3
      builder/dockerfile/dispatchers.go
  2. 15 0
      builder/dockerfile/dispatchers_test.go

+ 5 - 3
builder/dockerfile/dispatchers.go

@@ -200,7 +200,11 @@ func from(req dispatchRequest) error {
 	if err != nil {
 		return err
 	}
-	if image != nil {
+	switch image {
+	case nil:
+		req.state.imageID = ""
+		req.state.noBaseImage = true
+	default:
 		req.builder.imageContexts.update(image.ImageID(), image.RunConfig())
 	}
 	req.state.baseImage = image
@@ -248,8 +252,6 @@ func (b *Builder) getFromImage(dispatchState *dispatchState, shlex *ShellLex, na
 		if runtime.GOOS == "windows" {
 			return nil, errors.New("Windows does not support FROM scratch")
 		}
-		dispatchState.imageID = ""
-		dispatchState.noBaseImage = true
 		return nil, nil
 	}
 	return pullOrGetImage(b, name)

+ 15 - 0
builder/dockerfile/dispatchers_test.go

@@ -233,6 +233,21 @@ func TestFromWithUndefinedArg(t *testing.T) {
 	assert.Equal(t, expected, req.state.imageID)
 }
 
+func TestFromMultiStageWithScratchNamedStage(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		t.Skip("Windows does not support scratch")
+	}
+	b := newBuilderWithMockBackend()
+	req := defaultDispatchReq(b, "scratch", "AS", "base")
+
+	require.NoError(t, from(req))
+	assert.True(t, req.state.hasFromImage())
+
+	req.args = []string{"base"}
+	require.NoError(t, from(req))
+	assert.True(t, req.state.hasFromImage())
+}
+
 func TestOnbuildIllegalTriggers(t *testing.T) {
 	triggers := []struct{ command, expectedError string }{
 		{"ONBUILD", "Chaining ONBUILD via `ONBUILD ONBUILD` isn't allowed"},