From 165624062e1ac105b6e45beba51cec6439918f11 Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Wed, 5 Nov 2014 15:12:24 -0800 Subject: [PATCH] Close stdin after execution with `docker exec -i` Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- daemon/exec.go | 2 +- integration-cli/docker_cli_exec_test.go | 42 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/daemon/exec.go b/daemon/exec.go index 058b712625..d813dbba1d 100644 --- a/daemon/exec.go +++ b/daemon/exec.go @@ -203,7 +203,7 @@ func (d *Daemon) ContainerExecStart(job *engine.Job) engine.Status { execConfig.StreamConfig.stdinPipe = ioutils.NopWriteCloser(ioutil.Discard) // Silently drop stdin } - attachErr := d.attach(&execConfig.StreamConfig, execConfig.OpenStdin, false, execConfig.ProcessConfig.Tty, cStdin, cStdout, cStderr) + attachErr := d.attach(&execConfig.StreamConfig, execConfig.OpenStdin, true, execConfig.ProcessConfig.Tty, cStdin, cStdout, cStderr) execErr := make(chan error) diff --git a/integration-cli/docker_cli_exec_test.go b/integration-cli/docker_cli_exec_test.go index 2a9e30e688..6626a33a8b 100644 --- a/integration-cli/docker_cli_exec_test.go +++ b/integration-cli/docker_cli_exec_test.go @@ -2,6 +2,7 @@ package main import ( "bufio" + "os" "os/exec" "strings" "testing" @@ -31,6 +32,47 @@ func TestExec(t *testing.T) { logDone("exec - basic test") } +func TestExecInteractiveStdinClose(t *testing.T) { + defer deleteAllContainers() + out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "run", "-itd", "busybox", "/bin/cat")) + if err != nil { + t.Fatal(err) + } + + contId := strings.TrimSpace(out) + println(contId) + + returnchan := make(chan struct{}) + + go func() { + var err error + cmd := exec.Command(dockerBinary, "exec", "-i", contId, "/bin/ls", "/") + cmd.Stdin = os.Stdin + if err != nil { + t.Fatal(err) + } + + out, err := cmd.CombinedOutput() + if err != nil { + t.Fatal(err, out) + } + + if string(out) == "" { + t.Fatalf("Output was empty, likely blocked by standard input") + } + + returnchan <- struct{}{} + }() + + select { + case <-returnchan: + case <-time.After(10 * time.Second): + t.Fatal("timed out running docker exec") + } + + logDone("exec - interactive mode closes stdin after execution") +} + func TestExecInteractive(t *testing.T) { runCmd := exec.Command(dockerBinary, "run", "-d", "--name", "testing", "busybox", "sh", "-c", "echo test > /tmp/file && sleep 100") if out, _, _, err := runCommandWithStdoutStderr(runCmd); err != nil {