diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 66d3206c7f..b1d63338de 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -2967,3 +2967,23 @@ func TestRunOOMExitCode(t *testing.T) { logDone("run - exit code on oom") } + +func TestRunRestartMaxRetries(t *testing.T) { + defer deleteAllContainers() + out, err := exec.Command(dockerBinary, "run", "-d", "--restart=on-failure:3", "busybox", "false").CombinedOutput() + if err != nil { + t.Fatal(string(out), err) + } + id := strings.TrimSpace(string(out)) + if err := waitInspect(id, "{{ .State.Restarting }} {{ .State.Running }}", "false false", 5); err != nil { + t.Fatal(err) + } + count, err := inspectField(id, "RestartCount") + if err != nil { + t.Fatal(err) + } + if count != "3" { + t.Fatalf("Container was restarted %s times, expected %d", count, 3) + } + logDone("run - test max-retries for --restart") +} diff --git a/integration-cli/utils.go b/integration-cli/utils.go index fefd66f339..f67ee78ca7 100644 --- a/integration-cli/utils.go +++ b/integration-cli/utils.go @@ -135,28 +135,32 @@ func waitForContainer(contID string, args ...string) error { } func waitRun(contID string) error { - after := time.After(5 * time.Second) + return waitInspect(contID, "{{.State.Running}}", "true", 5) +} + +func waitInspect(name, expr, expected string, timeout int) error { + after := time.After(time.Duration(timeout) * time.Second) for { - cmd := exec.Command(dockerBinary, "inspect", "-f", "{{.State.Running}}", contID) + cmd := exec.Command(dockerBinary, "inspect", "-f", expr, name) out, _, err := runCommandWithOutput(cmd) if err != nil { return fmt.Errorf("error executing docker inspect: %v", err) } - if strings.Contains(out, "true") { + out = strings.TrimSpace(out) + if out == expected { break } select { case <-after: - return fmt.Errorf("container did not come up in time") + return fmt.Errorf("condition \"%q == %q\" not true in time", out, expected) default: } time.Sleep(100 * time.Millisecond) } - return nil }