diff --git a/cmd/dockerd/daemon_windows.go b/cmd/dockerd/daemon_windows.go index 08a77b7cb81d7..ee180b062d180 100644 --- a/cmd/dockerd/daemon_windows.go +++ b/cmd/dockerd/daemon_windows.go @@ -10,6 +10,7 @@ import ( "github.com/docker/docker/daemon/config" "github.com/docker/docker/libcontainerd/supervisor" "github.com/docker/docker/pkg/system" + "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/windows" ) @@ -93,7 +94,30 @@ func newCgroupParent(config *config.Config) string { return "" } -func (cli *DaemonCli) initContainerD(_ context.Context) (func(time.Duration) error, error) { +func (cli *DaemonCli) initContainerD(ctx context.Context) (func(time.Duration) error, error) { + if cli.Config.ContainerdAddr == "" && cli.Config.DefaultRuntime == config.WindowsV2RuntimeName { + cli.Config.ContainerdAddr = supervisor.GrpcPipeName + system.InitContainerdRuntime(cli.Config.ContainerdAddr) + + var waitForShutdown func(time.Duration) error + logrus.Debug("Starting daemon managed containerd") + opts, err := cli.getContainerdDaemonOpts() + if err != nil { + return nil, errors.Wrap(err, "failed to generate containerd options") + } + + r, err := supervisor.Start(ctx, filepath.Join(cli.Config.Root, "containerd"), filepath.Join(cli.Config.ExecRoot, "containerd"), opts...) + if err != nil { + return nil, errors.Wrap(err, "failed to start containerd") + } + logrus.Debug("Started daemon managed containerd") + cli.Config.ContainerdAddr = r.Address() + + // Try to wait for containerd to shutdown + waitForShutdown = r.WaitTimeout + return waitForShutdown, nil + } + system.InitContainerdRuntime(cli.Config.ContainerdAddr) return nil, nil } diff --git a/daemon/config/config.go b/daemon/config/config.go index 645beb8c032f6..9d26e46436fef 100644 --- a/daemon/config/config.go +++ b/daemon/config/config.go @@ -61,11 +61,6 @@ const ( SeccompProfileUnconfined = "unconfined" ) -var builtinRuntimes = map[string]bool{ - StockRuntimeName: true, - LinuxV2RuntimeName: true, -} - // flatOptions contains configuration keys // that MUST NOT be parsed as deep structures. // Use this to differentiate these options diff --git a/daemon/config/config_linux.go b/daemon/config/config_linux.go index 27d1c11806a33..8e038d8c47252 100644 --- a/daemon/config/config_linux.go +++ b/daemon/config/config_linux.go @@ -25,6 +25,11 @@ const ( StockRuntimeName = "runc" ) +var builtinRuntimes = map[string]bool{ + StockRuntimeName: true, + LinuxV2RuntimeName: true, +} + // BridgeConfig stores all the bridge driver specific // configuration. type BridgeConfig struct { diff --git a/daemon/config/config_windows.go b/daemon/config/config_windows.go index 29d7dbaa16c58..bb32a402a5e6b 100644 --- a/daemon/config/config_windows.go +++ b/daemon/config/config_windows.go @@ -8,8 +8,16 @@ const ( // This is used by the `default-runtime` flag in dockerd as the default value. // On windows we'd prefer to keep this empty so the value is auto-detected based on other options. StockRuntimeName = "" + + WindowsV1RuntimeName = "com.docker.hcsshim.v1" + WindowsV2RuntimeName = "io.containerd.runhcs.v1" ) +var builtinRuntimes = map[string]bool{ + WindowsV1RuntimeName: true, + WindowsV2RuntimeName: true, +} + // BridgeConfig stores all the bridge driver specific // configuration. type BridgeConfig struct { diff --git a/daemon/daemon_windows.go b/daemon/daemon_windows.go index 3dc8e09aeb8d4..0eabf9057ddcc 100644 --- a/daemon/daemon_windows.go +++ b/daemon/daemon_windows.go @@ -43,9 +43,6 @@ const ( windowsMaxCPUShares = 10000 windowsMinCPUPercent = 1 windowsMaxCPUPercent = 100 - - windowsV1RuntimeName = "com.docker.hcsshim.v1" - windowsV2RuntimeName = "io.containerd.runhcs.v1" ) // Windows containers are much larger than Linux containers and each of them @@ -637,14 +634,14 @@ func (daemon *Daemon) initLibcontainerd(ctx context.Context) error { rt := daemon.configStore.GetDefaultRuntimeName() if rt == "" { if daemon.configStore.ContainerdAddr == "" { - rt = windowsV1RuntimeName + rt = config.WindowsV1RuntimeName } else { - rt = windowsV2RuntimeName + rt = config.WindowsV2RuntimeName } } switch rt { - case windowsV1RuntimeName: + case config.WindowsV1RuntimeName: daemon.containerd, err = local.NewClient( ctx, daemon.containerdCli, @@ -652,7 +649,7 @@ func (daemon *Daemon) initLibcontainerd(ctx context.Context) error { daemon.configStore.ContainerdNamespace, daemon, ) - case windowsV2RuntimeName: + case config.WindowsV2RuntimeName: if daemon.configStore.ContainerdAddr == "" { return fmt.Errorf("cannot use the specified runtime %q without containerd", rt) } diff --git a/libcontainerd/supervisor/remote_daemon_windows.go b/libcontainerd/supervisor/remote_daemon_windows.go index 9b254ef58a0aa..420ba8a8d5eb0 100644 --- a/libcontainerd/supervisor/remote_daemon_windows.go +++ b/libcontainerd/supervisor/remote_daemon_windows.go @@ -7,13 +7,13 @@ import ( ) const ( - grpcPipeName = `\\.\pipe\containerd-containerd` - debugPipeName = `\\.\pipe\containerd-debug` + GrpcPipeName = `\\.\pipe\docker-containerd` + debugPipeName = `\\.\pipe\docker-containerd-debug` ) func (r *remote) setDefaults() { if r.GRPC.Address == "" { - r.GRPC.Address = grpcPipeName + r.GRPC.Address = GrpcPipeName } if r.Debug.Address == "" { r.Debug.Address = debugPipeName