docker.go 2.6 KB

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