package supervisor import ( "os" "path/filepath" "github.com/containerd/log" "github.com/pkg/errors" ) // WithLogLevel defines which log level to start containerd with. func WithLogLevel(lvl string) DaemonOpt { return func(r *remote) error { if lvl == "info" { // both dockerd and containerd default log-level is "info", // so don't pass the default. lvl = "" } r.Config.Debug.Level = lvl return nil } } // WithLogFormat defines the containerd log format. // This only makes sense if WithStartDaemon() was set to true. func WithLogFormat(format log.OutputFormat) DaemonOpt { return func(r *remote) error { r.Debug.Format = string(format) return nil } } // WithCRIDisabled disables the CRI plugin. func WithCRIDisabled() DaemonOpt { return func(r *remote) error { r.DisabledPlugins = append(r.DisabledPlugins, "io.containerd.grpc.v1.cri") return nil } } // WithDetectLocalBinary checks if a containerd binary is present in the same // directory as the dockerd binary, and overrides the path of the containerd // binary to start if found. If no binary is found, no changes are made. func WithDetectLocalBinary() DaemonOpt { return func(r *remote) error { dockerdPath, err := os.Executable() if err != nil { return errors.Wrap(err, "looking up binary path") } localBinary := filepath.Join(filepath.Dir(dockerdPath), binaryName) fi, err := os.Stat(localBinary) if err != nil { if !errors.Is(err, os.ErrNotExist) { return err } return nil } if fi.IsDir() { return errors.Errorf("local containerd path found (%s), but is a directory", localBinary) } r.daemonPath = localBinary r.logger.WithField("daemon path", r.daemonPath).Debug("Local containerd daemon found.") return nil } }