diff --git a/api/server/exec.go b/api/server/exec.go index cd12c58d51..dd38c0a030 100644 --- a/api/server/exec.go +++ b/api/server/exec.go @@ -65,7 +65,7 @@ func (s *Server) postContainerExecStart(version version.Version, w http.Response } var ( execName = vars["name"] - stdin io.ReadCloser + stdin, inStream io.ReadCloser stdout, stderr, outStream io.Writer ) @@ -77,7 +77,7 @@ func (s *Server) postContainerExecStart(version version.Version, w http.Response if !execStartCheck.Detach { var err error // Setting up the streaming http interface. - inStream, outStream, err := hijackServer(w) + inStream, outStream, err = hijackServer(w) if err != nil { return err } @@ -95,6 +95,8 @@ func (s *Server) postContainerExecStart(version version.Version, w http.Response stderr = stdcopy.NewStdWriter(outStream, stdcopy.Stderr) stdout = stdcopy.NewStdWriter(outStream, stdcopy.Stdout) } + } else { + outStream = w } // Now run the user process in container. diff --git a/integration-cli/docker_cli_exec_test.go b/integration-cli/docker_cli_exec_test.go index 76ae9c95dd..cded7c8d47 100644 --- a/integration-cli/docker_cli_exec_test.go +++ b/integration-cli/docker_cli_exec_test.go @@ -595,3 +595,14 @@ func (s *DockerSuite) TestExecOnReadonlyContainer(c *check.C) { c.Fatalf("exec into a read-only container failed with exit status %d", status) } } + +// #15750 +func (s *DockerSuite) TestExecStartFails(c *check.C) { + name := "exec-15750" + dockerCmd(c, "run", "-d", "--name", name, "busybox", "top") + + _, errmsg, status := dockerCmdWithStdoutStderr(nil, "exec", name, "no-such-cmd") + if status == 255 && !strings.Contains(errmsg, "executable file not found") { + c.Fatal("exec error message not received. The daemon might had crashed") + } +} diff --git a/integration-cli/docker_utils.go b/integration-cli/docker_utils.go index 3c9cd48195..e9304f7c02 100644 --- a/integration-cli/docker_utils.go +++ b/integration-cli/docker_utils.go @@ -602,7 +602,9 @@ func dockerCmdWithError(args ...string) (string, int, error) { func dockerCmdWithStdoutStderr(c *check.C, args ...string) (string, string, int) { stdout, stderr, status, err := runCommandWithStdoutStderr(exec.Command(dockerBinary, args...)) - c.Assert(err, check.IsNil, check.Commentf("%q failed with errors: %s, %v", strings.Join(args, " "), stderr, err)) + if c != nil { + c.Assert(err, check.IsNil, check.Commentf("%q failed with errors: %s, %v", strings.Join(args, " "), stderr, err)) + } return stdout, stderr, status }