From 0ded8645b622ad31e9d8c60467758b60f4b05515 Mon Sep 17 00:00:00 2001 From: Marat Radchenko Date: Mon, 28 Jul 2025 17:49:39 +0300 Subject: [PATCH] Fix custom runtimes handling on Windows This commit partially reverts 7ccf750daad37aa12e790d5f057b7ae6a140e0b8 and 84965c075215de0add8968848e7f93219155be85 Closes #50542 Signed-off-by: Marat Radchenko --- daemon/command/daemon_windows.go | 10 ++---- daemon/config/config_windows.go | 6 ---- daemon/daemon.go | 4 ++- daemon/daemon_unix.go | 13 ------- daemon/daemon_windows.go | 35 ------------------- .../libcontainerd/libcontainerd_windows.go | 7 +--- daemon/start_windows.go | 22 +++++++----- 7 files changed, 20 insertions(+), 77 deletions(-) diff --git a/daemon/command/daemon_windows.go b/daemon/command/daemon_windows.go index b45f91418c..26ee3f54d5 100644 --- a/daemon/command/daemon_windows.go +++ b/daemon/command/daemon_windows.go @@ -9,7 +9,6 @@ import ( "github.com/containerd/log" "github.com/moby/moby/v2/daemon/config" - "github.com/moby/moby/v2/daemon/internal/libcontainerd" "golang.org/x/sys/windows" ) @@ -101,17 +100,12 @@ func newCgroupParent(*config.Config) string { } func (cli *daemonCLI) initContainerd(ctx context.Context) (func(time.Duration) error, error) { - defer func() { - if cli.Config.ContainerdAddr != "" { - libcontainerd.ContainerdRuntimeEnabled = true - } - }() - if cli.Config.ContainerdAddr != "" { return nil, nil } - if cli.Config.DefaultRuntime != config.WindowsV2RuntimeName { + if cli.Config.DefaultRuntime == "" || cli.Config.DefaultRuntime == config.WindowsV1RuntimeName { + // Legacy non-containerd runtime is used return nil, nil } diff --git a/daemon/config/config_windows.go b/daemon/config/config_windows.go index 32696b25a9..0cde71ff9b 100644 --- a/daemon/config/config_windows.go +++ b/daemon/config/config_windows.go @@ -17,14 +17,8 @@ const ( StockRuntimeName = "" WindowsV1RuntimeName = "com.docker.hcsshim.v1" - WindowsV2RuntimeName = "io.containerd.runhcs.v1" ) -var builtinRuntimes = map[string]bool{ - WindowsV1RuntimeName: true, - WindowsV2RuntimeName: true, -} - // BridgeConfig is meant to store all the parameters for both the bridge driver and the default bridge network. On // Windows: 1. "bridge" in this context reference the nat driver and the default nat network; 2. the nat driver has no // specific parameters, so this struct effectively just stores parameters for the default nat network. diff --git a/daemon/daemon.go b/daemon/daemon.go index 4f7ad50aa6..6865ecef5a 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -50,6 +50,7 @@ import ( "github.com/moby/moby/v2/daemon/internal/idtools" "github.com/moby/moby/v2/daemon/internal/image" "github.com/moby/moby/v2/daemon/internal/layer" + "github.com/moby/moby/v2/daemon/internal/libcontainerd" libcontainerdtypes "github.com/moby/moby/v2/daemon/internal/libcontainerd/types" "github.com/moby/moby/v2/daemon/internal/metrics" pluginexec "github.com/moby/moby/v2/daemon/internal/plugin/executor/containerd" @@ -1165,7 +1166,8 @@ func NewDaemon(ctx context.Context, config *config.Config, pluginStore *plugin.S go d.execCommandGC() - if err := d.initLibcontainerd(ctx, &cfgStore.Config); err != nil { + d.containerd, err = libcontainerd.NewClient(ctx, d.containerdClient, filepath.Join(config.ExecRoot, "containerd"), config.ContainerdNamespace, d) + if err != nil { return nil, err } diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go index 98d04017f2..eb74c88b55 100644 --- a/daemon/daemon_unix.go +++ b/daemon/daemon_unix.go @@ -28,7 +28,6 @@ import ( "github.com/moby/moby/v2/daemon/config" "github.com/moby/moby/v2/daemon/container" "github.com/moby/moby/v2/daemon/initlayer" - "github.com/moby/moby/v2/daemon/internal/libcontainerd/remote" "github.com/moby/moby/v2/daemon/internal/otelutil" "github.com/moby/moby/v2/daemon/internal/usergroup" "github.com/moby/moby/v2/daemon/libnetwork" @@ -1646,18 +1645,6 @@ func getSysInfo(cfg *config.Config) *sysinfo.SysInfo { return sysinfo.New(siOpts...) } -func (daemon *Daemon) initLibcontainerd(ctx context.Context, cfg *config.Config) error { - var err error - daemon.containerd, err = remote.NewClient( - ctx, - daemon.containerdClient, - filepath.Join(cfg.ExecRoot, "containerd"), - cfg.ContainerdNamespace, - daemon, - ) - return err -} - func recursiveUnmount(target string) error { return mount.RecursiveUnmount(target) } diff --git a/daemon/daemon_windows.go b/daemon/daemon_windows.go index 42310b1414..fba9ae8342 100644 --- a/daemon/daemon_windows.go +++ b/daemon/daemon_windows.go @@ -16,8 +16,6 @@ import ( networktypes "github.com/moby/moby/api/types/network" "github.com/moby/moby/v2/daemon/config" "github.com/moby/moby/v2/daemon/container" - "github.com/moby/moby/v2/daemon/internal/libcontainerd/local" - "github.com/moby/moby/v2/daemon/internal/libcontainerd/remote" "github.com/moby/moby/v2/daemon/internal/system" "github.com/moby/moby/v2/daemon/libnetwork" nwconfig "github.com/moby/moby/v2/daemon/libnetwork/config" @@ -573,36 +571,3 @@ func setupResolvConf(config *config.Config) {} func getSysInfo(*config.Config) *sysinfo.SysInfo { return sysinfo.New() } - -func (daemon *Daemon) initLibcontainerd(ctx context.Context, cfg *config.Config) error { - var err error - - rt := cfg.DefaultRuntime - if rt == "" { - if cfg.ContainerdAddr == "" { - rt = config.WindowsV1RuntimeName - } else { - rt = config.WindowsV2RuntimeName - } - } - - switch rt { - case config.WindowsV1RuntimeName: - daemon.containerd, err = local.NewClient(ctx, daemon) - case config.WindowsV2RuntimeName: - if cfg.ContainerdAddr == "" { - return fmt.Errorf("cannot use the specified runtime %q without containerd", rt) - } - daemon.containerd, err = remote.NewClient( - ctx, - daemon.containerdClient, - filepath.Join(cfg.ExecRoot, "containerd"), - cfg.ContainerdNamespace, - daemon, - ) - default: - return fmt.Errorf("unknown windows runtime %s", rt) - } - - return err -} diff --git a/daemon/internal/libcontainerd/libcontainerd_windows.go b/daemon/internal/libcontainerd/libcontainerd_windows.go index b7cf51c7ea..d3d38b068c 100644 --- a/daemon/internal/libcontainerd/libcontainerd_windows.go +++ b/daemon/internal/libcontainerd/libcontainerd_windows.go @@ -9,14 +9,9 @@ import ( libcontainerdtypes "github.com/moby/moby/v2/daemon/internal/libcontainerd/types" ) -// ContainerdRuntimeEnabled determines whether to use containerd for runtime on Windows. -// -// TODO(thaJeztah): this value is equivalent to checking whether "cli.Config.ContainerdAddr != """ - do we really need it? -var ContainerdRuntimeEnabled = false - // NewClient creates a new libcontainerd client from a containerd client func NewClient(ctx context.Context, cli *containerd.Client, stateDir, ns string, b libcontainerdtypes.Backend) (libcontainerdtypes.Client, error) { - if !ContainerdRuntimeEnabled { + if cli == nil { return local.NewClient(ctx, b) } return remote.NewClient(ctx, cli, stateDir, ns, b) diff --git a/daemon/start_windows.go b/daemon/start_windows.go index 0e4c398cd3..30d4cc90d0 100644 --- a/daemon/start_windows.go +++ b/daemon/start_windows.go @@ -1,16 +1,22 @@ package daemon import ( - "github.com/Microsoft/hcsshim/cmd/containerd-shim-runhcs-v1/options" - "github.com/moby/moby/v2/daemon/config" + "context" + + "github.com/containerd/containerd/v2/defaults" "github.com/moby/moby/v2/daemon/container" - "github.com/moby/moby/v2/daemon/internal/libcontainerd" ) -func (daemon *Daemon) getLibcontainerdCreateOptions(*configStore, *container.Container) (string, any, error) { - if libcontainerd.ContainerdRuntimeEnabled { - opts := &options.Options{} - return config.WindowsV2RuntimeName, opts, nil +func (daemon *Daemon) getLibcontainerdCreateOptions(daemonCfg *configStore, container *container.Container) (string, any, error) { + if container.HostConfig.Runtime == "" { + if daemonCfg.DefaultRuntime != "" { + container.HostConfig.Runtime = daemonCfg.DefaultRuntime + } else { + container.HostConfig.Runtime = defaults.DefaultRuntime + } + + container.CheckpointTo(context.WithoutCancel(context.TODO()), daemon.containersReplica) } - return "", nil, nil + + return container.HostConfig.Runtime, nil, nil }