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

Fix image's `CMD` after `WORKDIR` in Dockerfile
Upstream-commit: a2b12b5e82d50dad6c4a109501260f2307cf1d75
Component: engine
This commit is contained in:
Brian Goff
2016-12-28 20:26:59 -05:00
committed by GitHub
2 changed files with 45 additions and 5 deletions

View File

@ -297,17 +297,17 @@ func workdir(b *Builder, args []string, attributes map[string]bool, original str
}
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 {
return err
} else if hit {
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 {
return err
}

View File

@ -7357,3 +7357,43 @@ func (s *DockerSuite) TestBuildWindowsEnvCaseInsensitive(c *check.C) {
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)
}