Browse Source

Windows: Fix restart for Hyper-V containers

Signed-off-by: Andrey Kolomentsev <andrey.kolomentsev@docker.com>
akolomentsev 6 years ago
parent
commit
5afe2705ac
1 changed files with 16 additions and 3 deletions
  1. 16 3
      daemon/restart.go

+ 16 - 3
daemon/restart.go

@@ -3,6 +3,7 @@ package daemon // import "github.com/docker/docker/daemon"
 import (
 	"fmt"
 
+	containertypes "github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/container"
 	"github.com/sirupsen/logrus"
 )
@@ -34,11 +35,23 @@ func (daemon *Daemon) ContainerRestart(name string, seconds *int) error {
 // gracefully stop, before forcefully terminating the container. If
 // given a negative duration, wait forever for a graceful stop.
 func (daemon *Daemon) containerRestart(container *container.Container, seconds int) error {
+
+	// Determine isolation. If not specified in the hostconfig, use daemon default.
+	actualIsolation := container.HostConfig.Isolation
+	if containertypes.Isolation.IsDefault(actualIsolation) {
+		actualIsolation = daemon.defaultIsolation
+	}
+
 	// Avoid unnecessarily unmounting and then directly mounting
 	// the container when the container stops and then starts
-	// again
-	if err := daemon.Mount(container); err == nil {
-		defer daemon.Unmount(container)
+	// again. We do not do this for Hyper-V isolated containers
+	// (implying also on Windows) as the HCS must have exclusive
+	// access to mount the containers filesystem inside the utility
+	// VM.
+	if !containertypes.Isolation.IsHyperV(actualIsolation) {
+		if err := daemon.Mount(container); err == nil {
+			defer daemon.Unmount(container)
+		}
 	}
 
 	if container.IsRunning() {