//go:build !no_cri_dockerd // +build !no_cri_dockerd package cridockerd import ( "context" "errors" "os" "runtime/debug" "strings" "github.com/Mirantis/cri-dockerd/cmd" "github.com/Mirantis/cri-dockerd/cmd/version" "github.com/k3s-io/k3s/pkg/agent/cri" "github.com/k3s-io/k3s/pkg/cgroups" "github.com/k3s-io/k3s/pkg/daemons/config" "github.com/sirupsen/logrus" utilsnet "k8s.io/utils/net" ) func Run(ctx context.Context, cfg *config.Node) error { if err := setupDockerCRIConfig(ctx, cfg); err != nil { return err } args := getDockerCRIArgs(cfg) command := cmd.NewDockerCRICommand(ctx.Done()) command.SetArgs(args) logrus.Infof("Running cri-dockerd %s", config.ArgString(args)) logrus.Infof("cri-dockerd version %s", version.FullVersion()) go func() { defer func() { if err := recover(); err != nil { logrus.WithField("stack", string(debug.Stack())).Fatalf("cri-dockerd panic: %v", err) } }() err := command.ExecuteContext(ctx) if err != nil && !errors.Is(err, context.Canceled) { logrus.Errorf("cri-dockerd exited: %v", err) os.Exit(1) } os.Exit(0) }() return cri.WaitForService(ctx, cfg.CRIDockerd.Address, "cri-dockerd") } func getDockerCRIArgs(cfg *config.Node) []string { argsMap := map[string]string{ "container-runtime-endpoint": cfg.CRIDockerd.Address, "cri-dockerd-root-directory": cfg.CRIDockerd.Root, "streaming-bind-addr": "127.0.0.1:10010", } if dualNode, _ := utilsnet.IsDualStackIPs(cfg.AgentConfig.NodeIPs); dualNode { argsMap["ipv6-dual-stack"] = "true" } if logLevel := os.Getenv("CRIDOCKERD_LOG_LEVEL"); logLevel != "" { argsMap["log-level"] = logLevel } if cfg.ContainerRuntimeEndpoint != "" { endpoint := cfg.ContainerRuntimeEndpoint if !strings.HasPrefix(endpoint, socketPrefix) { endpoint = socketPrefix + endpoint } argsMap["docker-endpoint"] = endpoint } if cfg.AgentConfig.CNIConfDir != "" { argsMap["cni-conf-dir"] = cfg.AgentConfig.CNIConfDir } if cfg.AgentConfig.CNIBinDir != "" { argsMap["cni-bin-dir"] = cfg.AgentConfig.CNIBinDir } if cfg.AgentConfig.CNIPlugin { argsMap["network-plugin"] = "cni" } if cfg.AgentConfig.PauseImage != "" { argsMap["pod-infra-container-image"] = cfg.AgentConfig.PauseImage } _, runtimeRoot, _ := cgroups.CheckCgroups() if runtimeRoot != "" { argsMap["runtime-cgroups"] = runtimeRoot } return config.GetArgs(argsMap, nil) }