From 8c0ecb638705e89746a81fa1320aafaa7ff701b2 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Thu, 14 Feb 2019 18:59:55 +0100 Subject: [PATCH] Fix stopped containers with restart-policy showing as "restarting" When manually stopping a container with a restart-policy, the container would show as "restarting" in `docker ps` whereas its actual state is "exited". Stopping a container with a restart policy shows the container as "restarting" docker run -d --name test --restart unless-stopped busybox false docker stop test docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e07409fa1d3 busybox "false" 5 minutes ago Restarting (1) 4 minutes ago test However, inspecting the same container shows that it's exited: docker inspect test --format '{{ json .State }}' { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 0, "ExitCode": 1, "Error": "", "StartedAt": "2019-02-14T13:26:27.6091648Z", "FinishedAt": "2019-02-14T13:26:27.689427Z" } And killing the container confirms this; docker kill test Error response from daemon: Cannot kill container: test: Container 7e07409fa1d36dc8d8cb8f25cf12ee1168ad9040183b85fafa73ee2c1fcf9361 is not running docker run -d --name test --restart unless-stopped busybox false docker stop test docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d0595237054a busybox "false" 5 minutes ago Restarting (1) 4 minutes ago exit Signed-off-by: Sebastiaan van Stijn --- daemon/monitor.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/daemon/monitor.go b/daemon/monitor.go index 9b4452d7ef..949dcb2fd7 100644 --- a/daemon/monitor.go +++ b/daemon/monitor.go @@ -85,6 +85,8 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc } daemon.LogContainerEventWithAttributes(c, "die", attributes) daemon.Cleanup(c) + daemon.setStateCounter(c) + cpErr := c.CheckpointTo(daemon.containersReplica) if err == nil && restart { go func() { @@ -101,6 +103,8 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc if err != nil { c.Lock() c.SetStopped(&exitStatus) + daemon.setStateCounter(c) + c.CheckpointTo(daemon.containersReplica) c.Unlock() defer daemon.autoRemove(c) if err != restartmanager.ErrRestartCanceled { @@ -110,8 +114,7 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc }() } - daemon.setStateCounter(c) - return c.CheckpointTo(daemon.containersReplica) + return cpErr } if execConfig := c.ExecCommands.Get(ei.ProcessID); execConfig != nil {