Skip to content

Commit

Permalink
Windows: Run containerd as managed process
Browse files Browse the repository at this point in the history
Signed-off-by: Olli Janatuinen <olli.janatuinen@gmail.com>
  • Loading branch information
olljanat committed Jul 31, 2022
1 parent 6e21389 commit 37fc37a
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 16 deletions.
26 changes: 25 additions & 1 deletion cmd/dockerd/daemon_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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
}
Expand Down
5 changes: 0 additions & 5 deletions daemon/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions daemon/config/config_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
8 changes: 8 additions & 0 deletions daemon/config/config_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
11 changes: 4 additions & 7 deletions daemon/daemon_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -637,22 +634,22 @@ 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,
filepath.Join(daemon.configStore.ExecRoot, "containerd"),
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)
}
Expand Down
6 changes: 3 additions & 3 deletions libcontainerd/supervisor/remote_daemon_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 37fc37a

Please sign in to comment.