docker.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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"
  11. "github.com/docker/docker/dockerversion"
  12. "github.com/docker/docker/pkg/reexec"
  13. "github.com/docker/docker/pkg/term"
  14. "github.com/docker/docker/utils"
  15. "github.com/spf13/cobra"
  16. "github.com/spf13/pflag"
  17. )
  18. type daemonOptions struct {
  19. version bool
  20. configFile string
  21. daemonConfig *daemon.Config
  22. common *cliflags.CommonOptions
  23. flags *pflag.FlagSet
  24. }
  25. func newDaemonCommand() *cobra.Command {
  26. opts := daemonOptions{
  27. daemonConfig: daemon.NewConfig(),
  28. common: cliflags.NewCommonOptions(),
  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. }
  41. cli.SetupRootCommand(cmd)
  42. flags := cmd.Flags()
  43. flags.BoolVarP(&opts.version, "version", "v", false, "Print version information and quit")
  44. flags.StringVar(&opts.configFile, flagDaemonConfigFile, defaultDaemonConfigFile, "Daemon configuration file")
  45. opts.common.InstallFlags(flags)
  46. opts.daemonConfig.InstallFlags(flags)
  47. installServiceFlags(flags)
  48. return cmd
  49. }
  50. func runDaemon(opts daemonOptions) error {
  51. if opts.version {
  52. showVersion()
  53. return nil
  54. }
  55. daemonCli := NewDaemonCli()
  56. // On Windows, if there's no explicit pidfile set, set to under the daemon root
  57. if runtime.GOOS == "windows" && opts.daemonConfig.Pidfile == "" {
  58. opts.daemonConfig.Pidfile = filepath.Join(opts.daemonConfig.Root, "docker.pid")
  59. }
  60. // On Windows, this may be launching as a service or with an option to
  61. // register the service.
  62. stop, err := initService(daemonCli)
  63. if err != nil {
  64. logrus.Fatal(err)
  65. }
  66. if stop {
  67. return nil
  68. }
  69. err = daemonCli.start(opts)
  70. notifyShutdown(err)
  71. return err
  72. }
  73. func showVersion() {
  74. if utils.ExperimentalBuild() {
  75. fmt.Printf("Docker version %s, build %s, experimental\n", dockerversion.Version, dockerversion.GitCommit)
  76. } else {
  77. fmt.Printf("Docker version %s, build %s\n", dockerversion.Version, dockerversion.GitCommit)
  78. }
  79. }
  80. func main() {
  81. if reexec.Init() {
  82. return
  83. }
  84. // Set terminal emulation based on platform as required.
  85. _, stdout, stderr := term.StdStreams()
  86. logrus.SetOutput(stderr)
  87. cmd := newDaemonCommand()
  88. cmd.SetOutput(stdout)
  89. if err := cmd.Execute(); err != nil {
  90. fmt.Fprintf(stderr, "%s\n", err)
  91. os.Exit(1)
  92. }
  93. }