Merge pull request #1525 from griff/1503-fix
Don't read from stdout when only attached to stdin
diff --git a/commands.go b/commands.go
index c0fee24..d90d0eb 100644
--- a/commands.go
+++ b/commands.go
@@ -1475,15 +1475,18 @@
v := url.Values{}
v.Set("logs", "1")
v.Set("stream", "1")
+ var out io.Writer
if config.AttachStdin {
v.Set("stdin", "1")
}
if config.AttachStdout {
v.Set("stdout", "1")
+ out = cli.out
}
if config.AttachStderr {
v.Set("stderr", "1")
+ out = cli.out
}
signals := make(chan os.Signal, 1)
@@ -1497,7 +1500,7 @@
}
}()
- if err := cli.hijack("POST", "/containers/"+runResult.ID+"/attach?"+v.Encode(), config.Tty, cli.in, cli.out); err != nil {
+ if err := cli.hijack("POST", "/containers/"+runResult.ID+"/attach?"+v.Encode(), config.Tty, cli.in, out); err != nil {
utils.Debugf("Error hijack: %s", err)
return err
}
@@ -1669,11 +1672,14 @@
rwc, br := clientconn.Hijack()
defer rwc.Close()
- receiveStdout := utils.Go(func() error {
- _, err := io.Copy(out, br)
- utils.Debugf("[hijack] End of stdout")
- return err
- })
+ var receiveStdout (chan error)
+ if out != nil {
+ receiveStdout = utils.Go(func() error {
+ _, err := io.Copy(out, br)
+ utils.Debugf("[hijack] End of stdout")
+ return err
+ })
+ }
if in != nil && setRawTerminal && cli.isTerminal && os.Getenv("NORAW") == "" {
oldState, err := term.SetRawTerminal(cli.terminalFd)
@@ -1701,9 +1707,11 @@
return nil
})
- if err := <-receiveStdout; err != nil {
- utils.Debugf("Error receiveStdout: %s", err)
- return err
+ if out != nil {
+ if err := <-receiveStdout; err != nil {
+ utils.Debugf("Error receiveStdout: %s", err)
+ return err
+ }
}
if !cli.isTerminal {
diff --git a/commands_test.go b/commands_test.go
index db344d7..25e4804 100644
--- a/commands_test.go
+++ b/commands_test.go
@@ -318,7 +318,7 @@
ch := make(chan struct{})
go func() {
defer close(ch)
- cli.CmdRun("-i", "-a", "stdin", unitTestImageID, "sh", "-c", "echo hello && cat")
+ cli.CmdRun("-i", "-a", "stdin", unitTestImageID, "sh", "-c", "echo hello && cat && sleep 5")
}()
// Send input to the command, close stdin
@@ -346,12 +346,10 @@
// wait for CmdRun to return
setTimeout(t, "Waiting for CmdRun timed out", 5*time.Second, func() {
- // Unblock hijack end
- stdout.Read([]byte{})
<-ch
})
- setTimeout(t, "Waiting for command to exit timed out", 5*time.Second, func() {
+ setTimeout(t, "Waiting for command to exit timed out", 10*time.Second, func() {
container.Wait()
})