From 1ff07a2840027bad5f277914c371e581a84b4a42 Mon Sep 17 00:00:00 2001 From: Alexandr Morozov Date: Tue, 19 Aug 2014 16:04:02 +0400 Subject: [PATCH 1/2] Fix logs -f hanging on stopped containers Fixes #7020 Signed-off-by: Alexandr Morozov Upstream-commit: badf8247afa378d04835ec19243ede2fb89a7b31 Component: engine --- components/engine/daemon/logs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/engine/daemon/logs.go b/components/engine/daemon/logs.go index 386d9c69c3..c9c2ab89ba 100644 --- a/components/engine/daemon/logs.go +++ b/components/engine/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() From 04302ddd9eebe2f1e4cf682a894a82454826e961 Mon Sep 17 00:00:00 2001 From: Alexandr Morozov Date: Wed, 20 Aug 2014 20:02:56 +0400 Subject: [PATCH 2/2] Test for following logs for stopped container Signed-off-by: Alexandr Morozov Upstream-commit: f04ef96e076b811eca1f7f230b126572369ccc44 Component: engine --- .../integration-cli/docker_cli_logs_test.go | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/components/engine/integration-cli/docker_cli_logs_test.go b/components/engine/integration-cli/docker_cli_logs_test.go index b32b7344b4..83d4597ce6 100644 --- a/components/engine/integration-cli/docker_cli_logs_test.go +++ b/components/engine/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") +}