diff --git a/api/server/server.go b/api/server/server.go index 6c20e1d73b..ed7dcfa5fa 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -1011,10 +1011,23 @@ func postContainersAttach(eng *engine.Engine, version version.Version, w http.Re } else { errStream = outStream } - logs := r.Form.Get("logs") != "" - stream := r.Form.Get("stream") != "" + logs := toBool(r.Form.Get("logs")) + stream := toBool(r.Form.Get("stream")) - if err := cont.AttachWithLogs(inStream, outStream, errStream, logs, stream); err != nil { + var stdin io.ReadCloser + var stdout, stderr io.Writer + + if toBool(r.Form.Get("stdin")) { + stdin = inStream + } + if toBool(r.Form.Get("stdout")) { + stdout = outStream + } + if toBool(r.Form.Get("stderr")) { + stderr = errStream + } + + if err := cont.AttachWithLogs(stdin, stdout, stderr, logs, stream); err != nil { fmt.Fprintf(outStream, "Error attaching: %s\n", err) } return nil diff --git a/daemon/attach.go b/daemon/attach.go index 72f38752e1..f95de41d52 100644 --- a/daemon/attach.go +++ b/daemon/attach.go @@ -61,13 +61,15 @@ func (c *Container) AttachWithLogs(stdin io.ReadCloser, stdout, stderr io.Writer //stream if stream { var stdinPipe io.ReadCloser - r, w := io.Pipe() - go func() { - defer w.Close() - defer logrus.Debugf("Closing buffered stdin pipe") - io.Copy(w, stdin) - }() - stdinPipe = r + if stdin != nil { + r, w := io.Pipe() + go func() { + defer w.Close() + defer logrus.Debugf("Closing buffered stdin pipe") + io.Copy(w, stdin) + }() + stdinPipe = r + } <-c.Attach(stdinPipe, stdout, stderr) // If we are in stdinonce mode, wait for the process to end // otherwise, simply return