package main import ( "fmt" "os" "runtime" "github.com/docker/docker/cli" "github.com/docker/docker/daemon/config" "github.com/docker/docker/dockerversion" "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/reexec" "github.com/docker/docker/pkg/term" "github.com/moby/buildkit/util/apicaps" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) func newDaemonCommand() *cobra.Command { opts := newDaemonOptions(config.New()) cmd := &cobra.Command{ Use: "dockerd [OPTIONS]", Short: "A self-sufficient runtime for containers.", SilenceUsage: true, SilenceErrors: true, Args: cli.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { opts.flags = cmd.Flags() return runDaemon(opts) }, DisableFlagsInUseLine: true, Version: fmt.Sprintf("%s, build %s", dockerversion.Version, dockerversion.GitCommit), } cli.SetupRootCommand(cmd) flags := cmd.Flags() flags.BoolP("version", "v", false, "Print version information and quit") flags.StringVar(&opts.configFile, "config-file", defaultDaemonConfigFile, "Daemon configuration file") opts.InstallFlags(flags) installConfigFlags(opts.daemonConfig, flags) installServiceFlags(flags) return cmd } func init() { if dockerversion.ProductName != "" { apicaps.ExportedProduct = dockerversion.ProductName } } func main() { if reexec.Init() { return } // initial log formatting; this setting is updated after the daemon configuration is loaded. logrus.SetFormatter(&logrus.TextFormatter{ TimestampFormat: jsonmessage.RFC3339NanoFixed, FullTimestamp: true, }) // Set terminal emulation based on platform as required. _, stdout, stderr := term.StdStreams() // @jhowardmsft - maybe there is a historic reason why on non-Windows, stderr is used // here. However, on Windows it makes no sense and there is no need. if runtime.GOOS == "windows" { logrus.SetOutput(stdout) } else { logrus.SetOutput(stderr) } cmd := newDaemonCommand() cmd.SetOutput(stdout) if err := cmd.Execute(); err != nil { fmt.Fprintf(stderr, "%s\n", err) os.Exit(1) } }