From d05d0211bcf43d4519bfcbbc6029fafa122f86b7 Mon Sep 17 00:00:00 2001 From: John Howard Date: Fri, 20 May 2016 16:05:14 -0700 Subject: [PATCH] Windows: CMD not honouring arg escaping Signed-off-by: John Howard --- builder/dockerfile/dispatchers.go | 2 ++ daemon/commit.go | 1 + integration-cli/docker_cli_build_test.go | 25 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go index 3e1bb822be..5c9e89b94a 100644 --- a/builder/dockerfile/dispatchers.go +++ b/builder/dockerfile/dispatchers.go @@ -407,6 +407,8 @@ func cmd(b *Builder, args []string, attributes map[string]bool, original string) } b.runConfig.Cmd = strslice.StrSlice(cmdSlice) + // set config as already being escaped, this prevents double escaping on windows + b.runConfig.ArgsEscaped = true if err := b.commit("", b.runConfig.Cmd, fmt.Sprintf("CMD %q", cmdSlice)); err != nil { return err diff --git a/daemon/commit.go b/daemon/commit.go index 24c7a46701..507a311233 100644 --- a/daemon/commit.go +++ b/daemon/commit.go @@ -74,6 +74,7 @@ func merge(userConf, imageConf *containertypes.Config) error { if len(userConf.Entrypoint) == 0 { if len(userConf.Cmd) == 0 { userConf.Cmd = imageConf.Cmd + userConf.ArgsEscaped = imageConf.ArgsEscaped } if userConf.Entrypoint == nil { diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 0adcd0e974..0ae891446b 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -6952,3 +6952,28 @@ func (s *DockerSuite) TestBuildShellWindowsPowershell(c *check.C) { c.Fatalf("Line with 'John' not found in output %q", out) } } + +// #22868. Make sure shell-form CMD is marked as escaped in the config of the image +func (s *DockerSuite) TestBuildCmdShellArgsEscaped(c *check.C) { + testRequires(c, DaemonIsWindows) + name := "testbuildcmdshellescaped" + + _, err := buildImage(name, ` + FROM `+minimalBaseImage()+` + CMD "tasklist" + `, true) + if err != nil { + c.Fatal(err) + } + res := inspectFieldJSON(c, name, "Config.ArgsEscaped") + if res != "true" { + c.Fatalf("CMD did not update Config.ArgsEscaped on image: %v", res) + } + dockerCmd(c, "run", "--name", "inspectme", name) + dockerCmd(c, "wait", "inspectme") + res = inspectFieldJSON(c, name, "Config.Cmd") + + if res != `["cmd","/S","/C","\"tasklist\""]` { + c.Fatalf("CMD was not escaped Config.Cmd: got %v", res) + } +}