Ver código fonte

builder: Fix setting command with custom shell

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Tonis Tiigi 8 anos atrás
pai
commit
a1fa59ea12

+ 2 - 2
builder/dockerfile/dispatchers.go

@@ -827,7 +827,7 @@ func errTooManyArguments(command string) error {
 // shell-form of RUN, ENTRYPOINT and CMD instructions
 // shell-form of RUN, ENTRYPOINT and CMD instructions
 func getShell(c *container.Config) []string {
 func getShell(c *container.Config) []string {
 	if 0 == len(c.Shell) {
 	if 0 == len(c.Shell) {
-		return defaultShell[:]
+		return append([]string{}, defaultShell[:]...)
 	}
 	}
-	return c.Shell[:]
+	return append([]string{}, c.Shell[:]...)
 }
 }

+ 15 - 0
integration-cli/docker_cli_build_test.go

@@ -6039,3 +6039,18 @@ func (s *DockerSuite) TestBuildLineErrorWithComments(c *check.C) {
 		Err:      "Dockerfile parse error line 5: Unknown instruction: NOINSTRUCTION",
 		Err:      "Dockerfile parse error line 5: Unknown instruction: NOINSTRUCTION",
 	})
 	})
 }
 }
+
+// #31957
+func (s *DockerSuite) TestBuildSetCommandWithDefinedShell(c *check.C) {
+	buildImageSuccessfully(c, "build1", build.WithDockerfile(`
+FROM busybox
+SHELL ["/bin/sh", "-c"]
+`))
+	buildImageSuccessfully(c, "build2", build.WithDockerfile(`
+FROM build1
+CMD echo foo
+`))
+
+	out, _ := dockerCmd(c, "inspect", "--format", "{{ json .Config.Cmd }}", "build2")
+	c.Assert(strings.TrimSpace(out), checker.Equals, `["/bin/sh","-c","echo foo"]`)
+}