docker.go 2.3 KB

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