github.com/flavio/docker@v0.1.3-0.20170117145210-f63d1a6eec47/cmd/dockerd/docker.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "runtime" 8 9 "github.com/Sirupsen/logrus" 10 "github.com/docker/docker/cli" 11 cliflags "github.com/docker/docker/cli/flags" 12 "github.com/docker/docker/daemon" 13 "github.com/docker/docker/dockerversion" 14 "github.com/docker/docker/pkg/reexec" 15 "github.com/docker/docker/pkg/term" 16 "github.com/spf13/cobra" 17 "github.com/spf13/pflag" 18 ) 19 20 type daemonOptions struct { 21 version bool 22 configFile string 23 daemonConfig *daemon.Config 24 common *cliflags.CommonOptions 25 flags *pflag.FlagSet 26 } 27 28 func newDaemonCommand() *cobra.Command { 29 opts := daemonOptions{ 30 daemonConfig: daemon.NewConfig(), 31 common: cliflags.NewCommonOptions(), 32 } 33 34 cmd := &cobra.Command{ 35 Use: "dockerd [OPTIONS]", 36 Short: "A self-sufficient runtime for containers.", 37 SilenceUsage: true, 38 SilenceErrors: true, 39 Args: cli.NoArgs, 40 RunE: func(cmd *cobra.Command, args []string) error { 41 opts.flags = cmd.Flags() 42 return runDaemon(opts) 43 }, 44 } 45 cli.SetupRootCommand(cmd) 46 47 flags := cmd.Flags() 48 flags.BoolVarP(&opts.version, "version", "v", false, "Print version information and quit") 49 flags.StringVar(&opts.configFile, flagDaemonConfigFile, defaultDaemonConfigFile, "Daemon configuration file") 50 opts.common.InstallFlags(flags) 51 opts.daemonConfig.InstallFlags(flags) 52 installServiceFlags(flags) 53 54 return cmd 55 } 56 57 func runDaemon(opts daemonOptions) error { 58 if opts.version { 59 showVersion() 60 return nil 61 } 62 63 daemonCli := NewDaemonCli() 64 65 // Windows specific settings as these are not defaulted. 66 if runtime.GOOS == "windows" { 67 if opts.daemonConfig.Pidfile == "" { 68 opts.daemonConfig.Pidfile = filepath.Join(opts.daemonConfig.Root, "docker.pid") 69 } 70 if opts.configFile == "" { 71 opts.configFile = filepath.Join(opts.daemonConfig.Root, `config\daemon.json`) 72 } 73 } 74 75 // On Windows, this may be launching as a service or with an option to 76 // register the service. 77 stop, err := initService(daemonCli) 78 if err != nil { 79 logrus.Fatal(err) 80 } 81 82 if stop { 83 return nil 84 } 85 86 err = daemonCli.start(opts) 87 notifyShutdown(err) 88 return err 89 } 90 91 func showVersion() { 92 fmt.Printf("Docker version %s, build %s\n", dockerversion.Version, dockerversion.GitCommit) 93 } 94 95 func main() { 96 if reexec.Init() { 97 return 98 } 99 100 // Set terminal emulation based on platform as required. 101 _, stdout, stderr := term.StdStreams() 102 logrus.SetOutput(stderr) 103 104 cmd := newDaemonCommand() 105 cmd.SetOutput(stdout) 106 if err := cmd.Execute(); err != nil { 107 fmt.Fprintf(stderr, "%s\n", err) 108 os.Exit(1) 109 } 110 }