github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/cmd/docker/docker.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/Sirupsen/logrus" 8 "github.com/docker/docker/cli" 9 "github.com/docker/docker/cli/command" 10 "github.com/docker/docker/cli/command/commands" 11 cliflags "github.com/docker/docker/cli/flags" 12 "github.com/docker/docker/cliconfig" 13 "github.com/docker/docker/dockerversion" 14 "github.com/docker/docker/pkg/term" 15 "github.com/docker/docker/utils" 16 "github.com/spf13/cobra" 17 "github.com/spf13/pflag" 18 ) 19 20 func newDockerCommand(dockerCli *command.DockerCli) *cobra.Command { 21 opts := cliflags.NewClientOptions() 22 var flags *pflag.FlagSet 23 24 cmd := &cobra.Command{ 25 Use: "docker [OPTIONS] COMMAND [arg...]", 26 Short: "A self-sufficient runtime for containers.", 27 SilenceUsage: true, 28 SilenceErrors: true, 29 TraverseChildren: true, 30 Args: noArgs, 31 RunE: func(cmd *cobra.Command, args []string) error { 32 if opts.Version { 33 showVersion() 34 return nil 35 } 36 fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) 37 return nil 38 }, 39 PersistentPreRunE: func(cmd *cobra.Command, args []string) error { 40 // flags must be the top-level command flags, not cmd.Flags() 41 opts.Common.SetDefaultOptions(flags) 42 dockerPreRun(opts) 43 return dockerCli.Initialize(opts) 44 }, 45 } 46 cli.SetupRootCommand(cmd) 47 48 flags = cmd.Flags() 49 flags.BoolVarP(&opts.Version, "version", "v", false, "Print version information and quit") 50 flags.StringVar(&opts.ConfigDir, "config", cliconfig.ConfigDir(), "Location of client config files") 51 opts.Common.InstallFlags(flags) 52 53 cmd.SetOutput(dockerCli.Out()) 54 cmd.AddCommand(newDaemonCommand()) 55 commands.AddCommands(cmd, dockerCli) 56 57 return cmd 58 } 59 60 func noArgs(cmd *cobra.Command, args []string) error { 61 if len(args) == 0 { 62 return nil 63 } 64 return fmt.Errorf( 65 "docker: '%s' is not a docker command.\nSee 'docker --help'%s", args[0], ".") 66 } 67 68 func main() { 69 // Set terminal emulation based on platform as required. 70 stdin, stdout, stderr := term.StdStreams() 71 logrus.SetOutput(stderr) 72 73 dockerCli := command.NewDockerCli(stdin, stdout, stderr) 74 cmd := newDockerCommand(dockerCli) 75 76 if err := cmd.Execute(); err != nil { 77 if sterr, ok := err.(cli.StatusError); ok { 78 if sterr.Status != "" { 79 fmt.Fprintln(stderr, sterr.Status) 80 } 81 // StatusError should only be used for errors, and all errors should 82 // have a non-zero exit status, so never exit with 0 83 if sterr.StatusCode == 0 { 84 os.Exit(1) 85 } 86 os.Exit(sterr.StatusCode) 87 } 88 fmt.Fprintln(stderr, err) 89 os.Exit(1) 90 } 91 } 92 93 func showVersion() { 94 if utils.ExperimentalBuild() { 95 fmt.Printf("Docker version %s, build %s, experimental\n", dockerversion.Version, dockerversion.GitCommit) 96 } else { 97 fmt.Printf("Docker version %s, build %s\n", dockerversion.Version, dockerversion.GitCommit) 98 } 99 } 100 101 func dockerPreRun(opts *cliflags.ClientOptions) { 102 cliflags.SetDaemonLogLevel(opts.Common.LogLevel) 103 104 if opts.ConfigDir != "" { 105 cliconfig.SetConfigDir(opts.ConfigDir) 106 } 107 108 if opts.Common.Debug { 109 utils.EnableDebug() 110 } 111 }