Browse Source

Merge pull request #7629 from LK4D4/fix_follow_hang_on_stop

Fix logs -f hanging on stopped containers
Michael Crosby 11 năm trước cách đây
mục cha
commit
228eda4fd5
2 tập tin đã thay đổi với 33 bổ sung1 xóa
  1. 1 1
      daemon/logs.go
  2. 32 0
      integration-cli/docker_cli_logs_test.go

+ 1 - 1
daemon/logs.go

@@ -111,7 +111,7 @@ func (daemon *Daemon) ContainerLogs(job *engine.Job) engine.Status {
 			}
 		}
 	}
-	if follow {
+	if follow && container.State.IsRunning() {
 		errors := make(chan error, 2)
 		if stdout {
 			stdoutPipe := container.StdoutLogPipe()

+ 32 - 0
integration-cli/docker_cli_logs_test.go

@@ -213,3 +213,35 @@ func TestLogsTail(t *testing.T) {
 	deleteContainer(cleanedContainerID)
 	logDone("logs - logs tail")
 }
+
+func TestLogsFollowStopped(t *testing.T) {
+	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "echo", "hello")
+
+	out, _, _, err := runCommandWithStdoutStderr(runCmd)
+	errorOut(err, t, fmt.Sprintf("run failed with errors: %v", err))
+
+	cleanedContainerID := stripTrailingCharacters(out)
+	exec.Command(dockerBinary, "wait", cleanedContainerID).Run()
+
+	logsCmd := exec.Command(dockerBinary, "logs", "-f", cleanedContainerID)
+	if err := logsCmd.Start(); err != nil {
+		t.Fatal(err)
+	}
+
+	c := make(chan struct{})
+	go func() {
+		if err := logsCmd.Wait(); err != nil {
+			t.Fatal(err)
+		}
+		close(c)
+	}()
+
+	select {
+	case <-c:
+	case <-time.After(1 * time.Second):
+		t.Fatal("Following logs is hanged")
+	}
+
+	deleteContainer(cleanedContainerID)
+	logDone("logs - logs follow stopped container")
+}