github.com/Heebron/moby@v0.0.0-20221111184709-6eab4f55faf7/cmd/dockerd/docker.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/docker/docker/cli" 8 "github.com/docker/docker/daemon/config" 9 "github.com/docker/docker/dockerversion" 10 "github.com/docker/docker/pkg/jsonmessage" 11 "github.com/docker/docker/pkg/reexec" 12 "github.com/docker/docker/rootless" 13 "github.com/moby/buildkit/util/apicaps" 14 "github.com/moby/term" 15 "github.com/sirupsen/logrus" 16 "github.com/spf13/cobra" 17 ) 18 19 var ( 20 honorXDG bool 21 ) 22 23 func newDaemonCommand() (*cobra.Command, error) { 24 cfg, err := config.New() 25 if err != nil { 26 return nil, err 27 } 28 opts := newDaemonOptions(cfg) 29 30 cmd := &cobra.Command{ 31 Use: "dockerd [OPTIONS]", 32 Short: "A self-sufficient runtime for containers.", 33 SilenceUsage: true, 34 SilenceErrors: true, 35 Args: cli.NoArgs, 36 RunE: func(cmd *cobra.Command, args []string) error { 37 opts.flags = cmd.Flags() 38 return runDaemon(opts) 39 }, 40 DisableFlagsInUseLine: true, 41 Version: fmt.Sprintf("%s, build %s", dockerversion.Version, dockerversion.GitCommit), 42 } 43 cli.SetupRootCommand(cmd) 44 45 flags := cmd.Flags() 46 flags.BoolP("version", "v", false, "Print version information and quit") 47 defaultDaemonConfigFile, err := getDefaultDaemonConfigFile() 48 if err != nil { 49 return nil, err 50 } 51 flags.StringVar(&opts.configFile, "config-file", defaultDaemonConfigFile, "Daemon configuration file") 52 configureCertsDir() 53 opts.installFlags(flags) 54 if err := installConfigFlags(opts.daemonConfig, flags); err != nil { 55 return nil, err 56 } 57 installServiceFlags(flags) 58 59 return cmd, nil 60 } 61 62 func init() { 63 if dockerversion.ProductName != "" { 64 apicaps.ExportedProduct = dockerversion.ProductName 65 } 66 // When running with RootlessKit, $XDG_RUNTIME_DIR, $XDG_DATA_HOME, and $XDG_CONFIG_HOME needs to be 67 // honored as the default dirs, because we are unlikely to have permissions to access the system-wide 68 // directories. 69 // 70 // Note that even running with --rootless, when not running with RootlessKit, honorXDG needs to be kept false, 71 // because the system-wide directories in the current mount namespace are expected to be accessible. 72 // ("rootful" dockerd in rootless dockerd, #38702) 73 honorXDG = rootless.RunningWithRootlessKit() 74 } 75 76 func main() { 77 if reexec.Init() { 78 return 79 } 80 81 // initial log formatting; this setting is updated after the daemon configuration is loaded. 82 logrus.SetFormatter(&logrus.TextFormatter{ 83 TimestampFormat: jsonmessage.RFC3339NanoFixed, 84 FullTimestamp: true, 85 }) 86 87 // Set terminal emulation based on platform as required. 88 _, stdout, stderr := term.StdStreams() 89 90 initLogging(stdout, stderr) 91 92 onError := func(err error) { 93 fmt.Fprintf(stderr, "%s\n", err) 94 os.Exit(1) 95 } 96 97 cmd, err := newDaemonCommand() 98 if err != nil { 99 onError(err) 100 } 101 cmd.SetOut(stdout) 102 if err := cmd.Execute(); err != nil { 103 onError(err) 104 } 105 }