builder: Restore /bin/sh handling in CMD when entrypoint is specified with JSON
Docker-DCO-1.1-Signed-off-by: Erik Hollensbe <github@hollensbe.org> (github: erikh)
diff --git a/builder/dispatchers.go b/builder/dispatchers.go
index e585c40..2184e48 100644
--- a/builder/dispatchers.go
+++ b/builder/dispatchers.go
@@ -234,7 +234,7 @@
func cmd(b *Builder, args []string, attributes map[string]bool, original string) error {
b.Config.Cmd = handleJsonArgs(args, attributes)
- if !attributes["json"] && len(b.Config.Entrypoint) == 0 {
+ if !attributes["json"] {
b.Config.Cmd = append([]string{"/bin/sh", "-c"}, b.Config.Cmd...)
}
diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go
index 276a16f..0885f91 100644
--- a/integration-cli/docker_cli_build_test.go
+++ b/integration-cli/docker_cli_build_test.go
@@ -16,6 +16,40 @@
"github.com/docker/docker/pkg/archive"
)
+func TestBuildShCmdJSONEntrypoint(t *testing.T) {
+ name := "testbuildshcmdjsonentrypoint"
+ defer deleteImages(name)
+
+ _, err := buildImage(
+ name,
+ `
+ FROM busybox
+ ENTRYPOINT ["/bin/echo"]
+ CMD echo test
+ `,
+ true)
+
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ out, _, err := runCommandWithOutput(
+ exec.Command(
+ dockerBinary,
+ "run",
+ name))
+
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if strings.TrimSpace(out) != "/bin/sh -c echo test" {
+ t.Fatal("CMD did not contain /bin/sh -c")
+ }
+
+ logDone("build - CMD should always contain /bin/sh -c when specified without JSON")
+}
+
func TestBuildEnvironmentReplacementUser(t *testing.T) {
name := "testbuildenvironmentreplacement"
defer deleteImages(name)