Przeglądaj źródła

Fix regressions in attach

* Wrong bool parsing
* Attach always all streams

Were introduced in #12120

Signed-off-by: Alexander Morozov <lk4d4@docker.com>
Alexander Morozov 10 lat temu
rodzic
commit
0fec3e19db
2 zmienionych plików z 25 dodań i 10 usunięć
  1. 16 3
      api/server/server.go
  2. 9 7
      daemon/attach.go

+ 16 - 3
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

+ 9 - 7
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