瀏覽代碼

Merge pull request #29679 from yongtang/29667-docker-build-workdir-cmd

Fix image's `CMD` after `WORKDIR` in Dockerfile
Brian Goff 8 年之前
父節點
當前提交
a2b12b5e82
共有 2 個文件被更改,包括 45 次插入5 次删除
  1. 5 5
      builder/dockerfile/dispatchers.go
  2. 40 0
      integration-cli/docker_cli_build_test.go

+ 5 - 5
builder/dockerfile/dispatchers.go

@@ -297,17 +297,17 @@ func workdir(b *Builder, args []string, attributes map[string]bool, original str
 	}
 	}
 	b.runConfig.Image = b.image
 	b.runConfig.Image = b.image
 
 
-	cmd := b.runConfig.Cmd
-	b.runConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), fmt.Sprintf("#(nop) WORKDIR %s", b.runConfig.WorkingDir)))
-	defer func(cmd strslice.StrSlice) { b.runConfig.Cmd = cmd }(cmd)
-
 	if hit, err := b.probeCache(); err != nil {
 	if hit, err := b.probeCache(); err != nil {
 		return err
 		return err
 	} else if hit {
 	} else if hit {
 		return nil
 		return nil
 	}
 	}
 
 
-	container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: b.runConfig})
+	// Actually copy the struct
+	workdirConfig := *b.runConfig
+	workdirConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), fmt.Sprintf("#(nop) WORKDIR %s", b.runConfig.WorkingDir)))
+
+	container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: &workdirConfig})
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 40 - 0
integration-cli/docker_cli_build_test.go

@@ -7357,3 +7357,43 @@ func (s *DockerSuite) TestBuildWindowsEnvCaseInsensitive(c *check.C) {
 		c.Fatalf("Case insensitive environment variables on Windows failed. Got %s", res)
 		c.Fatalf("Case insensitive environment variables on Windows failed. Got %s", res)
 	}
 	}
 }
 }
+
+// Test case for 29667
+func (s *DockerSuite) TestBuildWorkdirImageCmd(c *check.C) {
+	testRequires(c, DaemonIsLinux)
+
+	image := "testworkdirimagecmd"
+	dockerfile := `
+FROM busybox
+WORKDIR /foo/bar
+`
+	out, err := buildImage(image, dockerfile, true)
+	c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out))
+
+	out, _ = dockerCmd(c, "inspect", "--format", "{{ json .Config.Cmd }}", image)
+	c.Assert(strings.TrimSpace(out), checker.Equals, `["sh"]`)
+
+	image = "testworkdirlabelimagecmd"
+	dockerfile = `
+FROM busybox
+WORKDIR /foo/bar
+LABEL a=b
+`
+	out, err = buildImage(image, dockerfile, true)
+	c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out))
+
+	out, _ = dockerCmd(c, "inspect", "--format", "{{ json .Config.Cmd }}", image)
+	c.Assert(strings.TrimSpace(out), checker.Equals, `["sh"]`)
+}
+
+// Test case for 28902/28090
+func (s *DockerSuite) TestBuildWorkdirCmd(c *check.C) {
+	testRequires(c, DaemonIsLinux)
+
+	dockerFile := `
+                FROM golang:1.7-alpine
+                WORKDIR /
+                `
+	_, err := buildImage("testbuildworkdircmd", dockerFile, false)
+	c.Assert(err, checker.IsNil)
+}