diff --git a/libcontainerd/client_windows.go b/libcontainerd/client_windows.go index cf55ac2d4d..b7c6e1906c 100644 --- a/libcontainerd/client_windows.go +++ b/libcontainerd/client_windows.go @@ -557,8 +557,22 @@ func (clnt *client) Stats(containerID string) (*Stats, error) { // Restore is the handler for restoring a container func (clnt *client) Restore(containerID string, _ StdioCallback, unusedOnWindows ...CreateOption) error { - // TODO Windows: Implement this. For now, just tell the backend the container exited. logrus.Debugf("libcontainerd: Restore(%s)", containerID) + + // TODO Windows: On RS1, a re-attach isn't possible. + // However, there is a scenario in which there is an issue. + // Consider a background container. The daemon dies unexpectedly. + // HCS will still have the compute service alive and running. + // For consistence, we call in to shoot it regardless if HCS knows about it + // We explicitly just log a warning if the terminate fails. + // Then we tell the backend the container exited. + if hc, err := hcsshim.OpenContainer(containerID); err == nil { + if err := hc.Terminate(); err != nil { + if !hcsshim.IsPending(err) { + logrus.Warnf("libcontainerd: failed to terminate %s on restore - %q", containerID, err) + } + } + } return clnt.backend.StateChanged(containerID, StateInfo{ CommonStateInfo: CommonStateInfo{ State: StateExit,