From 083602384737635af9a89b75a6ca6d27f7515dc6 Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Fri, 23 Dec 2016 11:16:15 -0800 Subject: [PATCH] Fix image's `CMD` after `WORKDIR` in Dockerfile This fix tries to fix 29667 where image's `CMD` is modified after `WORKDIR` in Dockerfile. The value of `b.runConfig.Cmd` was modified in the processing of `WORKDIR`, in order to fix 28902. However, the same `b.runConfig.Cmd` is passed to `commit()`. This fix restored the `b.runConfig.Cmd` before `commit()` the image for `WORKDIR`. A test has been added. This fix fixes 29667. This fix is related to 28902, 28909, 28514. Signed-off-by: Yong Tang --- builder/dockerfile/dispatchers.go | 10 +++--- integration-cli/docker_cli_build_test.go | 40 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go index 4f3dcd8cd3..42eebd050d 100644 --- a/builder/dockerfile/dispatchers.go +++ b/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 - 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 } diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index c05e545b01..4bb4e65987 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/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) } } + +// 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) +}