From 259cc0cc87cbfe82c68b3b411631a4cd5d0cb80d Mon Sep 17 00:00:00 2001 From: Darren Stahl Date: Thu, 12 Oct 2017 16:31:33 -0700 Subject: [PATCH] Increase container default shutdown timeout on Windows The shutdown timeout for containers in insufficient on Windows. If the daemon is shutting down, and a container takes longer than expected to shut down, this can cause the container to remain in a bad state after restart, and never be able to start again. Increasing the timeout makes this less likely to occur. Signed-off-by: Darren Stahl Upstream-commit: ed74ee127f42f32ee98be7b908e1562b1c0554d7 Component: engine --- components/engine/container/container.go | 5 ----- components/engine/container/container_unix.go | 3 +++ components/engine/container/container_windows.go | 3 +++ components/engine/daemon/daemon.go | 3 ++- components/engine/integration-cli/docker_cli_daemon_test.go | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/components/engine/container/container.go b/components/engine/container/container.go index 10b9bcbe51..3e8a370241 100644 --- a/components/engine/container/container.go +++ b/components/engine/container/container.go @@ -52,11 +52,6 @@ import ( const configFileName = "config.v2.json" -const ( - // DefaultStopTimeout is the timeout (in seconds) for the syscall signal used to stop a container. - DefaultStopTimeout = 10 -) - var ( errInvalidEndpoint = errors.New("invalid endpoint while building port map info") errInvalidNetwork = errors.New("invalid network settings while building port map info") diff --git a/components/engine/container/container_unix.go b/components/engine/container/container_unix.go index 611bdfd9fb..98042f1308 100644 --- a/components/engine/container/container_unix.go +++ b/components/engine/container/container_unix.go @@ -21,6 +21,9 @@ import ( ) const ( + // DefaultStopTimeout is the timeout (in seconds) for the syscall signal used to stop a container. + DefaultStopTimeout = 10 + containerSecretMountPath = "/run/secrets" ) diff --git a/components/engine/container/container_windows.go b/components/engine/container/container_windows.go index 45d51e4f23..5cb2e456c9 100644 --- a/components/engine/container/container_windows.go +++ b/components/engine/container/container_windows.go @@ -16,6 +16,9 @@ const ( containerSecretMountPath = `C:\ProgramData\Docker\secrets` containerInternalSecretMountPath = `C:\ProgramData\Docker\internal\secrets` containerInternalConfigsDirPath = `C:\ProgramData\Docker\internal\configs` + + // DefaultStopTimeout is the timeout (in seconds) for the shutdown call on a container + DefaultStopTimeout = 30 ) // UnmountIpcMount unmounts Ipc related mounts. diff --git a/components/engine/daemon/daemon.go b/components/engine/daemon/daemon.go index 440cd91209..96b39e8820 100644 --- a/components/engine/daemon/daemon.go +++ b/components/engine/daemon/daemon.go @@ -993,7 +993,8 @@ func (daemon *Daemon) Shutdown() error { } if daemon.containers != nil { - logrus.Debugf("start clean shutdown of all containers with a %d seconds timeout...", daemon.configStore.ShutdownTimeout) + logrus.Debugf("daemon configured with a %d seconds minimum shutdown timeout", daemon.configStore.ShutdownTimeout) + logrus.Debugf("start clean shutdown of all containers with a %d seconds timeout...", daemon.ShutdownTimeout()) daemon.containers.ApplyAll(func(c *container.Container) { if !c.IsRunning() { return diff --git a/components/engine/integration-cli/docker_cli_daemon_test.go b/components/engine/integration-cli/docker_cli_daemon_test.go index 1737f34b4f..6865b9280a 100644 --- a/components/engine/integration-cli/docker_cli_daemon_test.go +++ b/components/engine/integration-cli/docker_cli_daemon_test.go @@ -2789,7 +2789,7 @@ func (s *DockerDaemonSuite) TestDaemonShutdownTimeout(c *check.C) { case <-time.After(5 * time.Second): } - expectedMessage := `level=debug msg="start clean shutdown of all containers with a 3 seconds timeout..."` + expectedMessage := `level=debug msg="daemon configured with a 3 seconds minimum shutdown timeout"` content, err := s.d.ReadLogFile() c.Assert(err, checker.IsNil) c.Assert(string(content), checker.Contains, expectedMessage)