docker.go 2.2 KB

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