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  }