Browse Source

Merge pull request #6052 from rhatdan/help

--help option and help command should print to stdout not stderr
Victor Vieux 11 years ago
parent
commit
76fd51a478

+ 5 - 4
api/client/cli.go

@@ -52,8 +52,8 @@ func (cli *DockerCli) Cmd(args ...string) error {
 	if len(args) > 0 {
 	if len(args) > 0 {
 		method, exists := cli.getMethod(args[0])
 		method, exists := cli.getMethod(args[0])
 		if !exists {
 		if !exists {
-			fmt.Println("Error: Command not found:", args[0])
-			return cli.CmdHelp(args[1:]...)
+			fmt.Fprintf(cli.err, "docker: '%s' is not a docker command. See 'docker --help'.\n", args[0])
+			os.Exit(1)
 		}
 		}
 		return method(args[1:]...)
 		return method(args[1:]...)
 	}
 	}
@@ -63,9 +63,10 @@ func (cli *DockerCli) Cmd(args ...string) error {
 func (cli *DockerCli) Subcmd(name, signature, description string) *flag.FlagSet {
 func (cli *DockerCli) Subcmd(name, signature, description string) *flag.FlagSet {
 	flags := flag.NewFlagSet(name, flag.ContinueOnError)
 	flags := flag.NewFlagSet(name, flag.ContinueOnError)
 	flags.Usage = func() {
 	flags.Usage = func() {
-		fmt.Fprintf(cli.err, "\nUsage: docker %s %s\n\n%s\n\n", name, signature, description)
+		fmt.Fprintf(cli.out, "\nUsage: docker %s %s\n\n%s\n\n", name, signature, description)
+		flags.SetOutput(cli.out)
 		flags.PrintDefaults()
 		flags.PrintDefaults()
-		os.Exit(2)
+		os.Exit(0)
 	}
 	}
 	return flags
 	return flags
 }
 }

+ 179 - 50
api/client/commands.go

@@ -48,6 +48,8 @@ func (cli *DockerCli) CmdHelp(args ...string) error {
 		method, exists := cli.getMethod(args[0])
 		method, exists := cli.getMethod(args[0])
 		if !exists {
 		if !exists {
 			fmt.Fprintf(cli.err, "Error: Command not found: %s\n", args[0])
 			fmt.Fprintf(cli.err, "Error: Command not found: %s\n", args[0])
+			fmt.Fprintf(cli.err, "docker: '%s' is not a docker command. See 'docker --help'.\n", args[0])
+			os.Exit(1)
 		} else {
 		} else {
 			method("--help")
 			method("--help")
 			return nil
 			return nil
@@ -93,7 +95,7 @@ func (cli *DockerCli) CmdHelp(args ...string) error {
 	} {
 	} {
 		help += fmt.Sprintf("    %-10.10s%s\n", command[0], command[1])
 		help += fmt.Sprintf("    %-10.10s%s\n", command[0], command[1])
 	}
 	}
-	fmt.Fprintf(cli.err, "%s\n", help)
+	fmt.Fprintf(cli.out, "%s\n", help)
 	return nil
 	return nil
 }
 }
 
 
@@ -104,13 +106,18 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
 	noCache := cmd.Bool([]string{"#no-cache", "-no-cache"}, false, "Do not use cache when building the image")
 	noCache := cmd.Bool([]string{"#no-cache", "-no-cache"}, false, "Do not use cache when building the image")
 	rm := cmd.Bool([]string{"#rm", "-rm"}, true, "Remove intermediate containers after a successful build")
 	rm := cmd.Bool([]string{"#rm", "-rm"}, true, "Remove intermediate containers after a successful build")
 	forceRm := cmd.Bool([]string{"-force-rm"}, false, "Always remove intermediate containers, even after unsuccessful builds")
 	forceRm := cmd.Bool([]string{"-force-rm"}, false, "Always remove intermediate containers, even after unsuccessful builds")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	var (
 	var (
 		context  archive.Archive
 		context  archive.Archive
@@ -262,10 +269,16 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
 	cmd.StringVar(&username, []string{"u", "-username"}, "", "Username")
 	cmd.StringVar(&username, []string{"u", "-username"}, "", "Username")
 	cmd.StringVar(&password, []string{"p", "-password"}, "", "Password")
 	cmd.StringVar(&password, []string{"p", "-password"}, "", "Password")
 	cmd.StringVar(&email, []string{"e", "-email"}, "", "Email")
 	cmd.StringVar(&email, []string{"e", "-email"}, "", "Email")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	err := cmd.Parse(args)
 	err := cmd.Parse(args)
 	if err != nil {
 	if err != nil {
 		return nil
 		return nil
 	}
 	}
+	if *help {
+		cmd.Usage()
+		return nil
+	}
 	serverAddress := registry.IndexServerAddress()
 	serverAddress := registry.IndexServerAddress()
 	if len(cmd.Args()) > 0 {
 	if len(cmd.Args()) > 0 {
 		serverAddress = cmd.Arg(0)
 		serverAddress = cmd.Arg(0)
@@ -385,13 +398,18 @@ func (cli *DockerCli) CmdLogout(args ...string) error {
 // 'docker wait': block until a container stops
 // 'docker wait': block until a container stops
 func (cli *DockerCli) CmdWait(args ...string) error {
 func (cli *DockerCli) CmdWait(args ...string) error {
 	cmd := cli.Subcmd("wait", "CONTAINER [CONTAINER...]", "Block until a container stops, then print its exit code.")
 	cmd := cli.Subcmd("wait", "CONTAINER [CONTAINER...]", "Block until a container stops, then print its exit code.")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 	var encounteredError error
 	var encounteredError error
 	for _, name := range cmd.Args() {
 	for _, name := range cmd.Args() {
 		status, err := waitForExit(cli, name)
 		status, err := waitForExit(cli, name)
@@ -411,10 +429,8 @@ func (cli *DockerCli) CmdVersion(args ...string) error {
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() > 0 {
-		cmd.Usage()
-		return nil
+	if cmd.BadArgs(0) {
+		os.Exit(1)
 	}
 	}
 	if dockerversion.VERSION != "" {
 	if dockerversion.VERSION != "" {
 		fmt.Fprintf(cli.out, "Client version: %s\n", dockerversion.VERSION)
 		fmt.Fprintf(cli.out, "Client version: %s\n", dockerversion.VERSION)
@@ -457,9 +473,8 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() > 0 {
-		cmd.Usage()
-		return nil
+	if cmd.BadArgs(0) {
+		os.Exit(1)
 	}
 	}
 
 
 	body, _, err := readBody(cli.call("GET", "/info", nil, false))
 	body, _, err := readBody(cli.call("GET", "/info", nil, false))
@@ -531,13 +546,18 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
 func (cli *DockerCli) CmdStop(args ...string) error {
 func (cli *DockerCli) CmdStop(args ...string) error {
 	cmd := cli.Subcmd("stop", "[OPTIONS] CONTAINER [CONTAINER...]", "Stop a running container by sending SIGTERM and then SIGKILL after a grace period")
 	cmd := cli.Subcmd("stop", "[OPTIONS] CONTAINER [CONTAINER...]", "Stop a running container by sending SIGTERM and then SIGKILL after a grace period")
 	nSeconds := cmd.Int([]string{"t", "-time"}, 10, "Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.")
 	nSeconds := cmd.Int([]string{"t", "-time"}, 10, "Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	v := url.Values{}
 	v := url.Values{}
 	v.Set("t", strconv.Itoa(*nSeconds))
 	v.Set("t", strconv.Itoa(*nSeconds))
@@ -558,13 +578,18 @@ func (cli *DockerCli) CmdStop(args ...string) error {
 func (cli *DockerCli) CmdRestart(args ...string) error {
 func (cli *DockerCli) CmdRestart(args ...string) error {
 	cmd := cli.Subcmd("restart", "[OPTIONS] CONTAINER [CONTAINER...]", "Restart a running container")
 	cmd := cli.Subcmd("restart", "[OPTIONS] CONTAINER [CONTAINER...]", "Restart a running container")
 	nSeconds := cmd.Int([]string{"t", "-time"}, 10, "Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.")
 	nSeconds := cmd.Int([]string{"t", "-time"}, 10, "Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	v := url.Values{}
 	v := url.Values{}
 	v.Set("t", strconv.Itoa(*nSeconds))
 	v.Set("t", strconv.Itoa(*nSeconds))
@@ -616,15 +641,19 @@ func (cli *DockerCli) CmdStart(args ...string) error {
 		cmd       = cli.Subcmd("start", "CONTAINER [CONTAINER...]", "Restart a stopped container")
 		cmd       = cli.Subcmd("start", "CONTAINER [CONTAINER...]", "Restart a stopped container")
 		attach    = cmd.Bool([]string{"a", "-attach"}, false, "Attach container's STDOUT and STDERR and forward all signals to the process")
 		attach    = cmd.Bool([]string{"a", "-attach"}, false, "Attach container's STDOUT and STDERR and forward all signals to the process")
 		openStdin = cmd.Bool([]string{"i", "-interactive"}, false, "Attach container's STDIN")
 		openStdin = cmd.Bool([]string{"i", "-interactive"}, false, "Attach container's STDIN")
+		help      = cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 	)
 	)
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	if *attach || *openStdin {
 	if *attach || *openStdin {
 		if cmd.NArg() > 1 {
 		if cmd.NArg() > 1 {
@@ -704,10 +733,8 @@ func (cli *DockerCli) CmdUnpause(args ...string) error {
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() != 1 {
-		cmd.Usage()
-		return nil
+	if cmd.BadArgs(1) {
+		os.Exit(1)
 	}
 	}
 
 
 	var encounteredError error
 	var encounteredError error
@@ -727,10 +754,8 @@ func (cli *DockerCli) CmdPause(args ...string) error {
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() != 1 {
-		cmd.Usage()
-		return nil
+	if cmd.BadArgs(1) {
+		os.Exit(1)
 	}
 	}
 
 
 	var encounteredError error
 	var encounteredError error
@@ -748,13 +773,18 @@ func (cli *DockerCli) CmdPause(args ...string) error {
 func (cli *DockerCli) CmdInspect(args ...string) error {
 func (cli *DockerCli) CmdInspect(args ...string) error {
 	cmd := cli.Subcmd("inspect", "CONTAINER|IMAGE [CONTAINER|IMAGE...]", "Return low-level information on a container or image")
 	cmd := cli.Subcmd("inspect", "CONTAINER|IMAGE [CONTAINER|IMAGE...]", "Return low-level information on a container or image")
 	tmplStr := cmd.String([]string{"f", "#format", "-format"}, "", "Format the output using the given go template.")
 	tmplStr := cmd.String([]string{"f", "#format", "-format"}, "", "Format the output using the given go template.")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	var tmpl *template.Template
 	var tmpl *template.Template
 	if *tmplStr != "" {
 	if *tmplStr != "" {
@@ -827,13 +857,18 @@ func (cli *DockerCli) CmdInspect(args ...string) error {
 
 
 func (cli *DockerCli) CmdTop(args ...string) error {
 func (cli *DockerCli) CmdTop(args ...string) error {
 	cmd := cli.Subcmd("top", "CONTAINER [ps OPTIONS]", "Display the running processes of a container")
 	cmd := cli.Subcmd("top", "CONTAINER [ps OPTIONS]", "Display the running processes of a container")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() == 0 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 	val := url.Values{}
 	val := url.Values{}
 	if cmd.NArg() > 1 {
 	if cmd.NArg() > 1 {
 		val.Set("ps_args", strings.Join(cmd.Args()[1:], " "))
 		val.Set("ps_args", strings.Join(cmd.Args()[1:], " "))
@@ -862,13 +897,17 @@ func (cli *DockerCli) CmdTop(args ...string) error {
 
 
 func (cli *DockerCli) CmdPort(args ...string) error {
 func (cli *DockerCli) CmdPort(args ...string) error {
 	cmd := cli.Subcmd("port", "CONTAINER PRIVATE_PORT", "Lookup the public-facing port that is NAT-ed to PRIVATE_PORT")
 	cmd := cli.Subcmd("port", "CONTAINER PRIVATE_PORT", "Lookup the public-facing port that is NAT-ed to PRIVATE_PORT")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() != 2 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(2) {
+		os.Exit(1)
+	}
 
 
 	var (
 	var (
 		port  = cmd.Arg(1)
 		port  = cmd.Arg(1)
@@ -912,13 +951,18 @@ func (cli *DockerCli) CmdRmi(args ...string) error {
 		force   = cmd.Bool([]string{"f", "-force"}, false, "Force removal of the image")
 		force   = cmd.Bool([]string{"f", "-force"}, false, "Force removal of the image")
 		noprune = cmd.Bool([]string{"-no-prune"}, false, "Do not delete untagged parents")
 		noprune = cmd.Bool([]string{"-no-prune"}, false, "Do not delete untagged parents")
 	)
 	)
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	v := url.Values{}
 	v := url.Values{}
 	if *force {
 	if *force {
@@ -957,14 +1001,18 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
 	cmd := cli.Subcmd("history", "[OPTIONS] IMAGE", "Show the history of an image")
 	cmd := cli.Subcmd("history", "[OPTIONS] IMAGE", "Show the history of an image")
 	quiet := cmd.Bool([]string{"q", "-quiet"}, false, "Only show numeric IDs")
 	quiet := cmd.Bool([]string{"q", "-quiet"}, false, "Only show numeric IDs")
 	noTrunc := cmd.Bool([]string{"#notrunc", "-no-trunc"}, false, "Don't truncate output")
 	noTrunc := cmd.Bool([]string{"#notrunc", "-no-trunc"}, false, "Don't truncate output")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	body, _, err := readBody(cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, false))
 	body, _, err := readBody(cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, false))
 	if err != nil {
 	if err != nil {
@@ -1015,14 +1063,18 @@ func (cli *DockerCli) CmdRm(args ...string) error {
 	v := cmd.Bool([]string{"v", "-volumes"}, false, "Remove the volumes associated with the container")
 	v := cmd.Bool([]string{"v", "-volumes"}, false, "Remove the volumes associated with the container")
 	link := cmd.Bool([]string{"l", "#link", "-link"}, false, "Remove the specified link and not the underlying container")
 	link := cmd.Bool([]string{"l", "#link", "-link"}, false, "Remove the specified link and not the underlying container")
 	force := cmd.Bool([]string{"f", "-force"}, false, "Force the removal of a running container (uses SIGKILL)")
 	force := cmd.Bool([]string{"f", "-force"}, false, "Force the removal of a running container (uses SIGKILL)")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	val := url.Values{}
 	val := url.Values{}
 	if *v {
 	if *v {
@@ -1053,14 +1105,18 @@ func (cli *DockerCli) CmdRm(args ...string) error {
 func (cli *DockerCli) CmdKill(args ...string) error {
 func (cli *DockerCli) CmdKill(args ...string) error {
 	cmd := cli.Subcmd("kill", "[OPTIONS] CONTAINER [CONTAINER...]", "Kill a running container using SIGKILL or a specified signal")
 	cmd := cli.Subcmd("kill", "[OPTIONS] CONTAINER [CONTAINER...]", "Kill a running container using SIGKILL or a specified signal")
 	signal := cmd.String([]string{"s", "-signal"}, "KILL", "Signal to send to the container")
 	signal := cmd.String([]string{"s", "-signal"}, "KILL", "Signal to send to the container")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	var encounteredError error
 	var encounteredError error
 	for _, name := range cmd.Args() {
 	for _, name := range cmd.Args() {
@@ -1076,15 +1132,18 @@ func (cli *DockerCli) CmdKill(args ...string) error {
 
 
 func (cli *DockerCli) CmdImport(args ...string) error {
 func (cli *DockerCli) CmdImport(args ...string) error {
 	cmd := cli.Subcmd("import", "URL|- [REPOSITORY[:TAG]]", "Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it.")
 	cmd := cli.Subcmd("import", "URL|- [REPOSITORY[:TAG]]", "Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it.")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() < 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
-
+	if cmd.BadArgs(2) {
+		os.Exit(1)
+	}
 	var (
 	var (
 		v          = url.Values{}
 		v          = url.Values{}
 		src        = cmd.Arg(0)
 		src        = cmd.Arg(0)
@@ -1118,9 +1177,15 @@ func (cli *DockerCli) CmdImport(args ...string) error {
 
 
 func (cli *DockerCli) CmdPush(args ...string) error {
 func (cli *DockerCli) CmdPush(args ...string) error {
 	cmd := cli.Subcmd("push", "NAME[:TAG]", "Push an image or a repository to the registry")
 	cmd := cli.Subcmd("push", "NAME[:TAG]", "Push an image or a repository to the registry")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
+	if *help {
+		cmd.Usage()
+		return nil
+	}
 	name := cmd.Arg(0)
 	name := cmd.Arg(0)
 
 
 	if name == "" {
 	if name == "" {
@@ -1184,14 +1249,19 @@ func (cli *DockerCli) CmdPush(args ...string) error {
 func (cli *DockerCli) CmdPull(args ...string) error {
 func (cli *DockerCli) CmdPull(args ...string) error {
 	cmd := cli.Subcmd("pull", "NAME[:TAG]", "Pull an image or a repository from the registry")
 	cmd := cli.Subcmd("pull", "NAME[:TAG]", "Pull an image or a repository from the registry")
 	tag := cmd.String([]string{"#t", "#-tag"}, "", "Download tagged image in a repository")
 	tag := cmd.String([]string{"#t", "#-tag"}, "", "Download tagged image in a repository")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 	var (
 	var (
 		v      = url.Values{}
 		v      = url.Values{}
 		remote = cmd.Arg(0)
 		remote = cmd.Arg(0)
@@ -1252,6 +1322,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
 	// FIXME: --viz and --tree are deprecated. Remove them in a future version.
 	// FIXME: --viz and --tree are deprecated. Remove them in a future version.
 	flViz := cmd.Bool([]string{"#v", "#viz", "#-viz"}, false, "Output graph in graphviz format")
 	flViz := cmd.Bool([]string{"#v", "#viz", "#-viz"}, false, "Output graph in graphviz format")
 	flTree := cmd.Bool([]string{"#t", "#tree", "#-tree"}, false, "Output graph in tree format")
 	flTree := cmd.Bool([]string{"#t", "#tree", "#-tree"}, false, "Output graph in tree format")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 
 
 	flFilter := opts.NewListOpts(nil)
 	flFilter := opts.NewListOpts(nil)
 	cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values (i.e. 'dangling=true')")
 	cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values (i.e. 'dangling=true')")
@@ -1259,10 +1330,13 @@ func (cli *DockerCli) CmdImages(args ...string) error {
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() > 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	// Consolidate all filter flags, and sanity check them early.
 	// Consolidate all filter flags, and sanity check them early.
 	// They'll get process in the daemon/server.
 	// They'll get process in the daemon/server.
@@ -1485,6 +1559,7 @@ func (cli *DockerCli) CmdPs(args ...string) error {
 	since := cmd.String([]string{"#sinceId", "#-since-id", "-since"}, "", "Show only containers created since Id or Name, include non-running ones.")
 	since := cmd.String([]string{"#sinceId", "#-since-id", "-since"}, "", "Show only containers created since Id or Name, include non-running ones.")
 	before := cmd.String([]string{"#beforeId", "#-before-id", "-before"}, "", "Show only container created before Id or Name, include non-running ones.")
 	before := cmd.String([]string{"#beforeId", "#-before-id", "-before"}, "", "Show only container created before Id or Name, include non-running ones.")
 	last := cmd.Int([]string{"n"}, -1, "Show n last created containers, include non-running ones.")
 	last := cmd.Int([]string{"n"}, -1, "Show n last created containers, include non-running ones.")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 
 
 	flFilter := opts.NewListOpts(nil)
 	flFilter := opts.NewListOpts(nil)
 	cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values. Valid filters:\nexited=<int> - containers with exit code of <int>")
 	cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values. Valid filters:\nexited=<int> - containers with exit code of <int>")
@@ -1492,6 +1567,10 @@ func (cli *DockerCli) CmdPs(args ...string) error {
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
+	if *help {
+		cmd.Usage()
+		return nil
+	}
 	v := url.Values{}
 	v := url.Values{}
 	if *last == -1 && *nLatest {
 	if *last == -1 && *nLatest {
 		*last = 1
 		*last = 1
@@ -1602,9 +1681,14 @@ func (cli *DockerCli) CmdCommit(args ...string) error {
 	flAuthor := cmd.String([]string{"a", "#author", "-author"}, "", "Author (e.g., \"John Hannibal Smith <hannibal@a-team.com>\")")
 	flAuthor := cmd.String([]string{"a", "#author", "-author"}, "", "Author (e.g., \"John Hannibal Smith <hannibal@a-team.com>\")")
 	// FIXME: --run is deprecated, it will be replaced with inline Dockerfile commands.
 	// FIXME: --run is deprecated, it will be replaced with inline Dockerfile commands.
 	flConfig := cmd.String([]string{"#run", "#-run"}, "", "This option is deprecated and will be removed in a future version in favor of inline Dockerfile-compatible commands")
 	flConfig := cmd.String([]string{"#run", "#-run"}, "", "This option is deprecated and will be removed in a future version in favor of inline Dockerfile-compatible commands")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
+	if *help {
+		cmd.Usage()
+		return nil
+	}
 
 
 	var (
 	var (
 		name            = cmd.Arg(0)
 		name            = cmd.Arg(0)
@@ -1660,14 +1744,19 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
 	cmd := cli.Subcmd("events", "[OPTIONS]", "Get real time events from the server")
 	cmd := cli.Subcmd("events", "[OPTIONS]", "Get real time events from the server")
 	since := cmd.String([]string{"#since", "-since"}, "", "Show all events created since timestamp")
 	since := cmd.String([]string{"#since", "-since"}, "", "Show all events created since timestamp")
 	until := cmd.String([]string{"-until"}, "", "Stream events until this timestamp")
 	until := cmd.String([]string{"-until"}, "", "Stream events until this timestamp")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() != 0 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(0) {
+		os.Exit(1)
+	}
+
 	var (
 	var (
 		v   = url.Values{}
 		v   = url.Values{}
 		loc = time.FixedZone(time.Now().Zone())
 		loc = time.FixedZone(time.Now().Zone())
@@ -1697,14 +1786,18 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
 
 
 func (cli *DockerCli) CmdExport(args ...string) error {
 func (cli *DockerCli) CmdExport(args ...string) error {
 	cmd := cli.Subcmd("export", "CONTAINER", "Export the contents of a filesystem as a tar archive to STDOUT")
 	cmd := cli.Subcmd("export", "CONTAINER", "Export the contents of a filesystem as a tar archive to STDOUT")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	if err := cli.stream("GET", "/containers/"+cmd.Arg(0)+"/export", nil, cli.out, nil); err != nil {
 	if err := cli.stream("GET", "/containers/"+cmd.Arg(0)+"/export", nil, cli.out, nil); err != nil {
 		return err
 		return err
@@ -1714,13 +1807,18 @@ func (cli *DockerCli) CmdExport(args ...string) error {
 
 
 func (cli *DockerCli) CmdDiff(args ...string) error {
 func (cli *DockerCli) CmdDiff(args ...string) error {
 	cmd := cli.Subcmd("diff", "CONTAINER", "Inspect changes on a container's filesystem")
 	cmd := cli.Subcmd("diff", "CONTAINER", "Inspect changes on a container's filesystem")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	body, _, err := readBody(cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, false))
 	body, _, err := readBody(cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, false))
 
 
@@ -1753,16 +1851,19 @@ func (cli *DockerCli) CmdLogs(args ...string) error {
 		follow = cmd.Bool([]string{"f", "-follow"}, false, "Follow log output")
 		follow = cmd.Bool([]string{"f", "-follow"}, false, "Follow log output")
 		times  = cmd.Bool([]string{"t", "-timestamps"}, false, "Show timestamps")
 		times  = cmd.Bool([]string{"t", "-timestamps"}, false, "Show timestamps")
 		tail   = cmd.String([]string{"-tail"}, "all", "Output the specified number of lines at the end of logs (defaults to all logs)")
 		tail   = cmd.String([]string{"-tail"}, "all", "Output the specified number of lines at the end of logs (defaults to all logs)")
+		help   = cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 	)
 	)
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 	name := cmd.Arg(0)
 	name := cmd.Arg(0)
 
 
 	steam, _, err := cli.call("GET", "/containers/"+name+"/json", nil, false)
 	steam, _, err := cli.call("GET", "/containers/"+name+"/json", nil, false)
@@ -1796,16 +1897,19 @@ func (cli *DockerCli) CmdAttach(args ...string) error {
 		cmd     = cli.Subcmd("attach", "[OPTIONS] CONTAINER", "Attach to a running container")
 		cmd     = cli.Subcmd("attach", "[OPTIONS] CONTAINER", "Attach to a running container")
 		noStdin = cmd.Bool([]string{"#nostdin", "-no-stdin"}, false, "Do not attach STDIN")
 		noStdin = cmd.Bool([]string{"#nostdin", "-no-stdin"}, false, "Do not attach STDIN")
 		proxy   = cmd.Bool([]string{"#sig-proxy", "-sig-proxy"}, true, "Proxy all received signals to the process (even in non-TTY mode). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.")
 		proxy   = cmd.Bool([]string{"#sig-proxy", "-sig-proxy"}, true, "Proxy all received signals to the process (even in non-TTY mode). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.")
+		help    = cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 	)
 	)
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 	name := cmd.Arg(0)
 	name := cmd.Arg(0)
 
 
 	stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, false)
 	stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, false)
@@ -1871,13 +1975,18 @@ func (cli *DockerCli) CmdSearch(args ...string) error {
 	trusted := cmd.Bool([]string{"#t", "#trusted", "#-trusted"}, false, "Only show trusted builds")
 	trusted := cmd.Bool([]string{"#t", "#trusted", "#-trusted"}, false, "Only show trusted builds")
 	automated := cmd.Bool([]string{"-automated"}, false, "Only show automated builds")
 	automated := cmd.Bool([]string{"-automated"}, false, "Only show automated builds")
 	stars := cmd.Int([]string{"s", "#stars", "-stars"}, 0, "Only displays with at least x stars")
 	stars := cmd.Int([]string{"s", "#stars", "-stars"}, 0, "Only displays with at least x stars")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	v := url.Values{}
 	v := url.Values{}
 	v.Set("term", cmd.Arg(0))
 	v.Set("term", cmd.Arg(0))
@@ -1923,13 +2032,18 @@ type ports []int
 func (cli *DockerCli) CmdTag(args ...string) error {
 func (cli *DockerCli) CmdTag(args ...string) error {
 	cmd := cli.Subcmd("tag", "[OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]", "Tag an image into a repository")
 	cmd := cli.Subcmd("tag", "[OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]", "Tag an image into a repository")
 	force := cmd.Bool([]string{"f", "#force", "-force"}, false, "Force")
 	force := cmd.Bool([]string{"f", "#force", "-force"}, false, "Force")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-	if cmd.NArg() != 2 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(2) {
+		os.Exit(1)
+	}
 
 
 	var (
 	var (
 		repository, tag = parsers.ParseRepositoryTag(cmd.Arg(1))
 		repository, tag = parsers.ParseRepositoryTag(cmd.Arg(1))
@@ -1994,6 +2108,11 @@ func (cli *DockerCli) CmdRun(args ...string) error {
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
+	if config == nil {
+		cmd.Usage()
+		return nil
+	}
+
 	if config.Image == "" {
 	if config.Image == "" {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
@@ -2216,14 +2335,18 @@ func (cli *DockerCli) CmdRun(args ...string) error {
 
 
 func (cli *DockerCli) CmdCp(args ...string) error {
 func (cli *DockerCli) CmdCp(args ...string) error {
 	cmd := cli.Subcmd("cp", "CONTAINER:PATH HOSTPATH", "Copy files/folders from the PATH to the HOSTPATH")
 	cmd := cli.Subcmd("cp", "CONTAINER:PATH HOSTPATH", "Copy files/folders from the PATH to the HOSTPATH")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return nil
 		return nil
 	}
 	}
-
-	if cmd.NArg() != 2 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(2) {
+		os.Exit(1)
+	}
 
 
 	var copyData engine.Env
 	var copyData engine.Env
 	info := strings.Split(cmd.Arg(0), ":")
 	info := strings.Split(cmd.Arg(0), ":")
@@ -2257,15 +2380,18 @@ func (cli *DockerCli) CmdCp(args ...string) error {
 func (cli *DockerCli) CmdSave(args ...string) error {
 func (cli *DockerCli) CmdSave(args ...string) error {
 	cmd := cli.Subcmd("save", "IMAGE", "Save an image to a tar archive (streamed to STDOUT by default)")
 	cmd := cli.Subcmd("save", "IMAGE", "Save an image to a tar archive (streamed to STDOUT by default)")
 	outfile := cmd.String([]string{"o", "-output"}, "", "Write to an file, instead of STDOUT")
 	outfile := cmd.String([]string{"o", "-output"}, "", "Write to an file, instead of STDOUT")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return err
 		return err
 	}
 	}
-
-	if cmd.NArg() != 1 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
+	}
 
 
 	var (
 	var (
 		output io.Writer = cli.out
 		output io.Writer = cli.out
@@ -2287,15 +2413,18 @@ func (cli *DockerCli) CmdSave(args ...string) error {
 func (cli *DockerCli) CmdLoad(args ...string) error {
 func (cli *DockerCli) CmdLoad(args ...string) error {
 	cmd := cli.Subcmd("load", "", "Load an image from a tar archive on STDIN")
 	cmd := cli.Subcmd("load", "", "Load an image from a tar archive on STDIN")
 	infile := cmd.String([]string{"i", "-input"}, "", "Read from a tar archive file, instead of STDIN")
 	infile := cmd.String([]string{"i", "-input"}, "", "Read from a tar archive file, instead of STDIN")
+	help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
 
 
 	if err := cmd.Parse(args); err != nil {
 	if err := cmd.Parse(args); err != nil {
 		return err
 		return err
 	}
 	}
-
-	if cmd.NArg() != 0 {
+	if *help {
 		cmd.Usage()
 		cmd.Usage()
 		return nil
 		return nil
 	}
 	}
+	if cmd.BadArgs(0) {
+		os.Exit(1)
+	}
 
 
 	var (
 	var (
 		input io.Reader = cli.in
 		input io.Reader = cli.in

+ 1 - 0
docker/flags.go

@@ -26,6 +26,7 @@ var (
 	flEnableCors  = flag.Bool([]string{"#api-enable-cors", "-api-enable-cors"}, false, "Enable CORS headers in the remote API")
 	flEnableCors  = flag.Bool([]string{"#api-enable-cors", "-api-enable-cors"}, false, "Enable CORS headers in the remote API")
 	flTls         = flag.Bool([]string{"-tls"}, false, "Use TLS; implied by tls-verify flags")
 	flTls         = flag.Bool([]string{"-tls"}, false, "Use TLS; implied by tls-verify flags")
 	flTlsVerify   = flag.Bool([]string{"-tlsverify"}, false, "Use TLS and verify the remote (daemon: verify client, client: verify daemon)")
 	flTlsVerify   = flag.Bool([]string{"-tlsverify"}, false, "Use TLS and verify the remote (daemon: verify client, client: verify daemon)")
+	flHelp        = flag.Bool([]string{"h", "-help"}, false, "Print usage")
 
 
 	// these are initialized in init() below since their default values depend on dockerCertPath which isn't fully initialized until init() runs
 	// these are initialized in init() below since their default values depend on dockerCertPath which isn't fully initialized until init() runs
 	flCa    *string
 	flCa    *string

+ 4 - 0
docs/man/docker-attach.1.md

@@ -6,6 +6,7 @@ docker-attach - Attach to a running container
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker attach**
 **docker attach**
+[**--help**]/
 [**--no-stdin**[=*false*]]
 [**--no-stdin**[=*false*]]
 [**--sig-proxy**[=*true*]]
 [**--sig-proxy**[=*true*]]
  CONTAINER
  CONTAINER
@@ -21,6 +22,9 @@ When you detach from a container the exit code will be returned to
 the client.
 the client.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **--no-stdin**=*true*|*false*
 **--no-stdin**=*true*|*false*
    Do not attach STDIN. The default is *false*.
    Do not attach STDIN. The default is *false*.
 
 

+ 4 - 0
docs/man/docker-build.1.md

@@ -6,6 +6,7 @@ docker-build - Build a new image from the source code at PATH
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker build**
 **docker build**
+[**--help**]
 [**--force-rm**[=*false*]]
 [**--force-rm**[=*false*]]
 [**--no-cache**[=*false*]]
 [**--no-cache**[=*false*]]
 [**-q**|**--quiet**[=*false*]]
 [**-q**|**--quiet**[=*false*]]
@@ -36,6 +37,9 @@ as context.
 **--no-cache**=*true*|*false*
 **--no-cache**=*true*|*false*
    Do not use cache when building the image. The default is *false*.
    Do not use cache when building the image. The default is *false*.
 
 
+**--help**
+  Print usage statement
+
 **-q**, **--quiet**=*true*|*false*
 **-q**, **--quiet**=*true*|*false*
    Suppress the verbose output generated by the containers. The default is *false*.
    Suppress the verbose output generated by the containers. The default is *false*.
 
 

+ 4 - 0
docs/man/docker-commit.1.md

@@ -7,6 +7,7 @@ docker-commit - Create a new image from a container's changes
 # SYNOPSIS
 # SYNOPSIS
 **docker commit**
 **docker commit**
 [**-a**|**--author**[=*AUTHOR*]]
 [**-a**|**--author**[=*AUTHOR*]]
+[**--help**]
 [**-m**|**--message**[=*MESSAGE*]]
 [**-m**|**--message**[=*MESSAGE*]]
 [**-p**|**--pause**[=*true*]]
 [**-p**|**--pause**[=*true*]]
  CONTAINER [REPOSITORY[:TAG]]
  CONTAINER [REPOSITORY[:TAG]]
@@ -18,6 +19,9 @@ Using an existing container's name or ID you can create a new image.
 **-a**, **--author**=""
 **-a**, **--author**=""
    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
 
 
+**--help**
+  Print usage statement
+
 **-m**, **--message**=""
 **-m**, **--message**=""
    Commit message
    Commit message
 
 

+ 3 - 1
docs/man/docker-cp.1.md

@@ -6,6 +6,7 @@ docker-cp - Copy files/folders from the PATH to the HOSTPATH
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker cp**
 **docker cp**
+[**--help**]
 CONTAINER:PATH HOSTPATH
 CONTAINER:PATH HOSTPATH
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -14,7 +15,8 @@ path. Paths are relative to the root of the filesystem. Files
 can be copied from a running or stopped container.
 can be copied from a running or stopped container.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
 # EXAMPLES
 # EXAMPLES
 An important shell script file, created in a bash shell, is copied from
 An important shell script file, created in a bash shell, is copied from

+ 3 - 1
docs/man/docker-diff.1.md

@@ -6,6 +6,7 @@ docker-diff - Inspect changes on a container's filesystem
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker diff**
 **docker diff**
+[**--help**]
 CONTAINER
 CONTAINER
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -14,7 +15,8 @@ shortened container ID or the container name set using
 **docker run --name** option.
 **docker run --name** option.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
 # EXAMPLES
 # EXAMPLES
 Inspect the changes to on a nginx container:
 Inspect the changes to on a nginx container:

+ 4 - 0
docs/man/docker-events.1.md

@@ -6,6 +6,7 @@ docker-events - Get real time events from the server
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker events**
 **docker events**
+[**--help**]
 [**--since**[=*SINCE*]]
 [**--since**[=*SINCE*]]
 [**--until**[=*UNTIL*]]
 [**--until**[=*UNTIL*]]
 
 
@@ -15,6 +16,9 @@ Get event information from the Docker daemon. Information can include historical
 information and real-time information.
 information and real-time information.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **--since**=""
 **--since**=""
    Show all events created since timestamp
    Show all events created since timestamp
 
 

+ 3 - 1
docs/man/docker-export.1.md

@@ -6,6 +6,7 @@ docker-export - Export the contents of a filesystem as a tar archive to STDOUT
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker export**
 **docker export**
+[**--help**]
 CONTAINER
 CONTAINER
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -14,7 +15,8 @@ container ID or container name. The output is exported to STDOUT and can be
 redirected to a tar file.
 redirected to a tar file.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
 # EXAMPLES
 # EXAMPLES
 Export the contents of the container called angry_bell to a tar file
 Export the contents of the container called angry_bell to a tar file

+ 4 - 0
docs/man/docker-history.1.md

@@ -6,6 +6,7 @@ docker-history - Show the history of an image
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker history**
 **docker history**
+[**--help**]
 [**--no-trunc**[=*false*]]
 [**--no-trunc**[=*false*]]
 [**-q**|**--quiet**[=*false*]]
 [**-q**|**--quiet**[=*false*]]
  IMAGE
  IMAGE
@@ -15,6 +16,9 @@ docker-history - Show the history of an image
 Show the history of when and how an image was created.
 Show the history of when and how an image was created.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **--no-trunc**=*true*|*false*
 **--no-trunc**=*true*|*false*
    Don't truncate output. The default is *false*.
    Don't truncate output. The default is *false*.
 
 

+ 4 - 0
docs/man/docker-images.1.md

@@ -6,6 +6,7 @@ docker-images - List images
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker images**
 **docker images**
+[**--help**]
 [**-a**|**--all**[=*false*]]
 [**-a**|**--all**[=*false*]]
 [**-f**|**--filter**[=*[]*]]
 [**-f**|**--filter**[=*[]*]]
 [**--no-trunc**[=*false*]]
 [**--no-trunc**[=*false*]]
@@ -35,6 +36,9 @@ versions.
 **-f**, **--filter**=[]
 **-f**, **--filter**=[]
    Provide filter values (i.e. 'dangling=true')
    Provide filter values (i.e. 'dangling=true')
 
 
+**--help**
+  Print usage statement
+
 **--no-trunc**=*true*|*false*
 **--no-trunc**=*true*|*false*
    Don't truncate output. The default is *false*.
    Don't truncate output. The default is *false*.
 
 

+ 3 - 1
docs/man/docker-import.1.md

@@ -6,6 +6,7 @@ docker-import - Create an empty filesystem image and import the contents of the
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker import**
 **docker import**
+[**--help**]
 URL|- [REPOSITORY[:TAG]]
 URL|- [REPOSITORY[:TAG]]
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -13,7 +14,8 @@ Create a new filesystem image from the contents of a tarball (`.tar`,
 `.tar.gz`, `.tgz`, `.bzip`, `.tar.xz`, `.txz`) into it, then optionally tag it.
 `.tar.gz`, `.tgz`, `.bzip`, `.tar.xz`, `.txz`) into it, then optionally tag it.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
 # EXAMPLES
 # EXAMPLES
 
 

+ 3 - 1
docs/man/docker-info.1.md

@@ -6,6 +6,7 @@ docker-info - Display system-wide information
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker info**
 **docker info**
+[**--help**]
 
 
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -20,7 +21,8 @@ allocates a certain amount of data space and meta data space from the space
 available on the volume where `/var/lib/docker` is mounted.
 available on the volume where `/var/lib/docker` is mounted.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
 # EXAMPLES
 # EXAMPLES
 
 

+ 4 - 0
docs/man/docker-inspect.1.md

@@ -6,6 +6,7 @@ docker-inspect - Return low-level information on a container or image
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker inspect**
 **docker inspect**
+[**--help**]
 [**-f**|**--format**[=*FORMAT*]]
 [**-f**|**--format**[=*FORMAT*]]
 CONTAINER|IMAGE [CONTAINER|IMAGE...]
 CONTAINER|IMAGE [CONTAINER|IMAGE...]
 
 
@@ -17,6 +18,9 @@ array. If a format is specified, the given template will be executed for
 each result.
 each result.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **-f**, **--format**=""
 **-f**, **--format**=""
    Format the output using the given go template.
    Format the output using the given go template.
 
 

+ 4 - 0
docs/man/docker-kill.1.md

@@ -6,6 +6,7 @@ docker-kill - Kill a running container using SIGKILL or a specified signal
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker kill**
 **docker kill**
+[**--help**]
 [**-s**|**--signal**[=*"KILL"*]]
 [**-s**|**--signal**[=*"KILL"*]]
  CONTAINER [CONTAINER...]
  CONTAINER [CONTAINER...]
 
 
@@ -15,6 +16,9 @@ The main process inside each container specified will be sent SIGKILL,
  or any signal specified with option --signal.
  or any signal specified with option --signal.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **-s**, **--signal**="KILL"
 **-s**, **--signal**="KILL"
    Signal to send to the container
    Signal to send to the container
 
 

+ 4 - 0
docs/man/docker-load.1.md

@@ -6,6 +6,7 @@ docker-load - Load an image from a tar archive on STDIN
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker load**
 **docker load**
+[**--help**]
 [**-i**|**--input**[=*INPUT*]]
 [**-i**|**--input**[=*INPUT*]]
 
 
 
 
@@ -15,6 +16,9 @@ Loads a tarred repository from a file or the standard input stream.
 Restores both images and tags.
 Restores both images and tags.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **-i**, **--input**=""
 **-i**, **--input**=""
    Read from a tar archive file, instead of STDIN
    Read from a tar archive file, instead of STDIN
 
 

+ 4 - 0
docs/man/docker-login.1.md

@@ -7,6 +7,7 @@ docker-login - Register or log in to a Docker registry server, if no server is s
 # SYNOPSIS
 # SYNOPSIS
 **docker login**
 **docker login**
 [**-e**|**--email**[=*EMAIL*]]
 [**-e**|**--email**[=*EMAIL*]]
+[**--help**]
 [**-p**|**--password**[=*PASSWORD*]]
 [**-p**|**--password**[=*PASSWORD*]]
 [**-u**|**--username**[=*USERNAME*]]
 [**-u**|**--username**[=*USERNAME*]]
  [SERVER]
  [SERVER]
@@ -20,6 +21,9 @@ login to a private registry you can specify this by adding the server name.
 **-e**, **--email**=""
 **-e**, **--email**=""
    Email
    Email
 
 
+**--help**
+  Print usage statement
+
 **-p**, **--password**=""
 **-p**, **--password**=""
    Password
    Password
 
 

+ 4 - 0
docs/man/docker-logs.1.md

@@ -7,6 +7,7 @@ docker-logs - Fetch the logs of a container
 # SYNOPSIS
 # SYNOPSIS
 **docker logs**
 **docker logs**
 [**-f**|**--follow**[=*false*]]
 [**-f**|**--follow**[=*false*]]
+[**--help**]
 [**-t**|**--timestamps**[=*false*]]
 [**-t**|**--timestamps**[=*false*]]
 [**--tail**[=*"all"*]]
 [**--tail**[=*"all"*]]
 CONTAINER
 CONTAINER
@@ -22,6 +23,9 @@ The **docker logs --follow** command combines commands **docker logs** and
 then continue streaming new output from the container’s stdout and stderr.
 then continue streaming new output from the container’s stdout and stderr.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **-f**, **--follow**=*true*|*false*
 **-f**, **--follow**=*true*|*false*
    Follow log output. The default is *false*.
    Follow log output. The default is *false*.
 
 

+ 1 - 0
docs/man/docker-port.1.md

@@ -6,6 +6,7 @@ docker-port - Lookup the public-facing port that is NAT-ed to PRIVATE_PORT
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker port**
 **docker port**
+[**--help**]
 CONTAINER PRIVATE_PORT
 CONTAINER PRIVATE_PORT
 
 
 # OPTIONS
 # OPTIONS

+ 4 - 0
docs/man/docker-ps.1.md

@@ -8,6 +8,7 @@ docker-ps - List containers
 **docker ps**
 **docker ps**
 [**-a**|**--all**[=*false*]]
 [**-a**|**--all**[=*false*]]
 [**--before**[=*BEFORE*]]
 [**--before**[=*BEFORE*]]
+[**--help**]
 [**-f**|**--filter**[=*[]*]]
 [**-f**|**--filter**[=*[]*]]
 [**-l**|**--latest**[=*false*]]
 [**-l**|**--latest**[=*false*]]
 [**-n**[=*-1*]]
 [**-n**[=*-1*]]
@@ -29,6 +30,9 @@ the running containers.
 **--before**=""
 **--before**=""
    Show only container created before Id or Name, include non-running ones.
    Show only container created before Id or Name, include non-running ones.
 
 
+**--help**
+  Print usage statement
+
 **-f**, **--filter**=[]
 **-f**, **--filter**=[]
    Provide filter values. Valid filters:
    Provide filter values. Valid filters:
                           exited=<int> - containers with exit code of <int>
                           exited=<int> - containers with exit code of <int>

+ 4 - 2
docs/man/docker-pull.1.md

@@ -6,6 +6,7 @@ docker-pull - Pull an image or a repository from the registry
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker pull**
 **docker pull**
+[**--help**] 
 NAME[:TAG]
 NAME[:TAG]
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -16,9 +17,10 @@ images for that repository name are pulled down including any tags.
 It is also possible to specify a non-default registry to pull from.
 It is also possible to specify a non-default registry to pull from.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
-# EXAMPLES
+# EXAMPLE
 
 
 # Pull a repository with multiple images
 # Pull a repository with multiple images
 
 

+ 3 - 1
docs/man/docker-push.1.md

@@ -6,6 +6,7 @@ docker-push - Push an image or a repository to the registry
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker push**
 **docker push**
+[**--help**]
 NAME[:TAG]
 NAME[:TAG]
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -15,7 +16,8 @@ image can be pushed to another, perhaps private, registry as demonstrated in
 the example below.
 the example below.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
 # EXAMPLES
 # EXAMPLES
 
 

+ 4 - 0
docs/man/docker-restart.1.md

@@ -6,6 +6,7 @@ docker-restart - Restart a running container
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker restart**
 **docker restart**
+[**--help**]
 [**-t**|**--time**[=*10*]]
 [**-t**|**--time**[=*10*]]
  CONTAINER [CONTAINER...]
  CONTAINER [CONTAINER...]
 
 
@@ -13,6 +14,9 @@ docker-restart - Restart a running container
 Restart each container listed.
 Restart each container listed.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **-t**, **--time**=10
 **-t**, **--time**=10
    Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.
    Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds.
 
 

+ 3 - 0
docs/man/docker-rm.1.md

@@ -19,6 +19,9 @@ remove a running container unless you use the \fB-f\fR option. To see all
 containers on a host use the **docker ps -a** command.
 containers on a host use the **docker ps -a** command.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **-f**, **--force**=*true*|*false*
 **-f**, **--force**=*true*|*false*
    Force the removal of a running container (uses SIGKILL). The default is *false*.
    Force the removal of a running container (uses SIGKILL). The default is *false*.
 
 

+ 4 - 0
docs/man/docker-rmi.1.md

@@ -7,6 +7,7 @@ docker-rmi - Remove one or more images
 # SYNOPSIS
 # SYNOPSIS
 **docker rmi**
 **docker rmi**
 [**-f**|**--force**[=*false*]]
 [**-f**|**--force**[=*false*]]
+[**--help**]
 [**--no-prune**[=*false*]]
 [**--no-prune**[=*false*]]
 IMAGE [IMAGE...]
 IMAGE [IMAGE...]
 
 
@@ -21,6 +22,9 @@ use the **docker images** command.
 **-f**, **--force**=*true*|*false*
 **-f**, **--force**=*true*|*false*
    Force removal of the image. The default is *false*.
    Force removal of the image. The default is *false*.
 
 
+**--help**
+  Print usage statement
+
 **--no-prune**=*true*|*false*
 **--no-prune**=*true*|*false*
    Do not delete untagged parents. The default is *false*.
    Do not delete untagged parents. The default is *false*.
 
 

+ 4 - 0
docs/man/docker-run.1.md

@@ -21,6 +21,7 @@ docker-run - Run a command in a new container
 [**--env-file**[=*[]*]]
 [**--env-file**[=*[]*]]
 [**--expose**[=*[]*]]
 [**--expose**[=*[]*]]
 [**-h**|**--hostname**[=*HOSTNAME*]]
 [**-h**|**--hostname**[=*HOSTNAME*]]
+[**--help**]
 [**-i**|**--interactive**[=*false*]]
 [**-i**|**--interactive**[=*false*]]
 [**--link**[=*[]*]]
 [**--link**[=*[]*]]
 [**--lxc-conf**[=*[]*]]
 [**--lxc-conf**[=*[]*]]
@@ -132,6 +133,9 @@ developer can expose the port using the EXPOSE parameter of the Dockerfile, 2)
 the operator can use the **--expose** option with **docker run**, or 3) the
 the operator can use the **--expose** option with **docker run**, or 3) the
 container can be started with the **--link**.
 container can be started with the **--link**.
 
 
+**--help**
+  Print usage statement
+
 **-h**, **--hostname**=*hostname*
 **-h**, **--hostname**=*hostname*
    Sets the container host name that is available inside the container.
    Sets the container host name that is available inside the container.
 
 

+ 4 - 0
docs/man/docker-save.1.md

@@ -6,6 +6,7 @@ docker-save - Save an image to a tar archive (streamed to STDOUT by default)
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker save**
 **docker save**
+[**--help**]
 [**-o**|**--output**[=*OUTPUT*]]
 [**-o**|**--output**[=*OUTPUT*]]
 IMAGE
 IMAGE
 
 
@@ -16,6 +17,9 @@ parent layers, and all tags + versions, or specified repo:tag.
 Stream to a file instead of STDOUT by using **-o**.
 Stream to a file instead of STDOUT by using **-o**.
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **-o**, **--output**=""
 **-o**, **--output**=""
    Write to an file, instead of STDOUT
    Write to an file, instead of STDOUT
 
 

+ 4 - 0
docs/man/docker-search.1.md

@@ -7,6 +7,7 @@ docker-search - Search the Docker Hub for images
 # SYNOPSIS
 # SYNOPSIS
 **docker search**
 **docker search**
 [**--automated**[=*false*]]
 [**--automated**[=*false*]]
+[**--help**]
 [**--no-trunc**[=*false*]]
 [**--no-trunc**[=*false*]]
 [**-s**|**--stars**[=*0*]]
 [**-s**|**--stars**[=*0*]]
 TERM
 TERM
@@ -22,6 +23,9 @@ is automated.
 **--automated**=*true*|*false*
 **--automated**=*true*|*false*
    Only show automated builds. The default is *false*.
    Only show automated builds. The default is *false*.
 
 
+**--help**
+  Print usage statement
+
 **--no-trunc**=*true*|*false*
 **--no-trunc**=*true*|*false*
    Don't truncate output. The default is *false*.
    Don't truncate output. The default is *false*.
 
 

+ 4 - 0
docs/man/docker-start.1.md

@@ -7,6 +7,7 @@ docker-start - Restart a stopped container
 # SYNOPSIS
 # SYNOPSIS
 **docker start**
 **docker start**
 [**-a**|**--attach**[=*false*]]
 [**-a**|**--attach**[=*false*]]
+[**--help**]
 [**-i**|**--interactive**[=*false*]]
 [**-i**|**--interactive**[=*false*]]
 CONTAINER [CONTAINER...]
 CONTAINER [CONTAINER...]
 
 
@@ -18,6 +19,9 @@ Start a stopped container.
 **-a**, **--attach**=*true*|*false*
 **-a**, **--attach**=*true*|*false*
    Attach container's STDOUT and STDERR and forward all signals to the process. The default is *false*.
    Attach container's STDOUT and STDERR and forward all signals to the process. The default is *false*.
 
 
+**--help**
+  Print usage statement
+
 **-i**, **--interactive**=*true*|*false*
 **-i**, **--interactive**=*true*|*false*
    Attach container's STDIN. The default is *false*.
    Attach container's STDIN. The default is *false*.
 
 

+ 4 - 0
docs/man/docker-stop.1.md

@@ -6,6 +6,7 @@ docker-stop - Stop a running container by sending SIGTERM and then SIGKILL after
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker stop**
 **docker stop**
+[**--help**]
 [**-t**|**--time**[=*10*]]
 [**-t**|**--time**[=*10*]]
  CONTAINER [CONTAINER...]
  CONTAINER [CONTAINER...]
 
 
@@ -14,6 +15,9 @@ Stop a running container (Send SIGTERM, and then SIGKILL after
  grace period)
  grace period)
 
 
 # OPTIONS
 # OPTIONS
+**--help**
+  Print usage statement
+
 **-t**, **--time**=10
 **-t**, **--time**=10
    Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.
    Number of seconds to wait for the container to stop before killing it. Default is 10 seconds.
 
 

+ 1 - 0
docs/man/docker-tag.1.md

@@ -7,6 +7,7 @@ docker-tag - Tag an image into a repository
 # SYNOPSIS
 # SYNOPSIS
 **docker tag**
 **docker tag**
 [**-f**|**--force**[=*false*]]
 [**-f**|**--force**[=*false*]]
+[**--help**]
  IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
  IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
 
 
 # DESCRIPTION
 # DESCRIPTION

+ 3 - 1
docs/man/docker-top.1.md

@@ -6,6 +6,7 @@ docker-top - Display the running processes of a container
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker top**
 **docker top**
+[**--help**]
 CONTAINER [ps OPTIONS]
 CONTAINER [ps OPTIONS]
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -14,7 +15,8 @@ Look up the running process of the container. ps-OPTION can be any of the
  options you would pass to a Linux ps command.
  options you would pass to a Linux ps command.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
 # EXAMPLES
 # EXAMPLES
 
 

+ 3 - 1
docs/man/docker-wait.1.md

@@ -6,6 +6,7 @@ docker-wait - Block until a container stops, then print its exit code.
 
 
 # SYNOPSIS
 # SYNOPSIS
 **docker wait**
 **docker wait**
+[**--help**]
 CONTAINER [CONTAINER...]
 CONTAINER [CONTAINER...]
 
 
 # DESCRIPTION
 # DESCRIPTION
@@ -13,7 +14,8 @@ CONTAINER [CONTAINER...]
 Block until a container stops, then print its exit code.
 Block until a container stops, then print its exit code.
 
 
 # OPTIONS
 # OPTIONS
-There are no available options.
+**--help**
+  Print usage statement
 
 
 # EXAMPLES
 # EXAMPLES
 
 

+ 3 - 0
docs/man/docker.1.md

@@ -26,6 +26,9 @@ To see the man page for a command run **man docker <command>**.
 **-D**=*true*|*false*
 **-D**=*true*|*false*
    Enable debug mode. Default is false.
    Enable debug mode. Default is false.
 
 
+**--help**
+  Print usage statement
+
 **-H**, **--host**=[unix:///var/run/docker.sock]: tcp://[host:port] to bind or
 **-H**, **--host**=[unix:///var/run/docker.sock]: tcp://[host:port] to bind or
 unix://[/path/to/socket] to use.
 unix://[/path/to/socket] to use.
    The socket(s) to bind to in daemon mode specified using one or more
    The socket(s) to bind to in daemon mode specified using one or more

+ 13 - 0
docs/sources/reference/commandline/cli.md

@@ -15,6 +15,19 @@ or execute `docker help`:
 
 
       ...
       ...
 
 
+## Help
+To list the help on any command just execute the command, followed by the `--help` option.
+
+    $ sudo docker run --help
+
+    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
+
+    Run a command in a new container
+
+      -a, --attach=[]            Attach to STDIN, STDOUT or STDERR.
+      -c, --cpu-shares=0         CPU shares (relative weight)
+    ...
+
 ## Option types
 ## Option types
 
 
 Single character commandline options can be combined, so rather than
 Single character commandline options can be combined, so rather than

+ 15 - 2
pkg/mflag/flag.go

@@ -395,6 +395,19 @@ func Lookup(name string) *Flag {
 	return CommandLine.formal[name]
 	return CommandLine.formal[name]
 }
 }
 
 
+func (f *FlagSet) BadArgs(nargs int) bool {
+	if NArg() < nargs {
+		fmt.Fprintf(f.out(), "docker: '%s' requires arguments. See 'docker %s --help'.\n", f.name, f.name)
+		return true
+	} else {
+		if nargs == 0 && NArg() != 0 {
+			fmt.Fprintf(f.out(), "docker: '%s' does not require arguments. See 'docker %s --help'.\n", f.name, f.name)
+			return true
+		}
+	}
+	return false
+}
+
 // Set sets the value of the named flag.
 // Set sets the value of the named flag.
 func (f *FlagSet) Set(name, value string) error {
 func (f *FlagSet) Set(name, value string) error {
 	flag, ok := f.formal[name]
 	flag, ok := f.formal[name]
@@ -468,7 +481,7 @@ func defaultUsage(f *FlagSet) {
 // Usage prints to standard error a usage message documenting all defined command-line flags.
 // Usage prints to standard error a usage message documenting all defined command-line flags.
 // The function is a variable that may be changed to point to a custom function.
 // The function is a variable that may be changed to point to a custom function.
 var Usage = func() {
 var Usage = func() {
-	fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
+	fmt.Fprintf(CommandLine.output, "Usage of %s:\n", os.Args[0])
 	PrintDefaults()
 	PrintDefaults()
 }
 }
 
 
@@ -757,7 +770,7 @@ func Var(value Value, names []string, usage string) {
 func (f *FlagSet) failf(format string, a ...interface{}) error {
 func (f *FlagSet) failf(format string, a ...interface{}) error {
 	err := fmt.Errorf(format, a...)
 	err := fmt.Errorf(format, a...)
 	fmt.Fprintln(f.out(), err)
 	fmt.Fprintln(f.out(), err)
-	f.usage()
+	fmt.Fprintf(f.out(), "See 'docker %s --help'.\n", f.name)
 	return err
 	return err
 }
 }
 
 

+ 10 - 2
runconfig/parse.go

@@ -3,6 +3,7 @@ package runconfig
 import (
 import (
 	"fmt"
 	"fmt"
 	"io/ioutil"
 	"io/ioutil"
+	"os"
 	"path"
 	"path"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
@@ -75,6 +76,8 @@ func parseRun(cmd *flag.FlagSet, args []string, sysInfo *sysinfo.SysInfo) (*Conf
 		flNetMode         = cmd.String([]string{"-net"}, "bridge", "Set the Network mode for the container\n'bridge': creates a new network stack for the container on the docker bridge\n'none': no networking for this container\n'container:<name|id>': reuses another container network stack\n'host': use the host network stack inside the container.  Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.")
 		flNetMode         = cmd.String([]string{"-net"}, "bridge", "Set the Network mode for the container\n'bridge': creates a new network stack for the container on the docker bridge\n'none': no networking for this container\n'container:<name|id>': reuses another container network stack\n'host': use the host network stack inside the container.  Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.")
 		flRestartPolicy   = cmd.String([]string{"-restart"}, "", "Restart policy to apply when a container exits (no, on-failure[:max-retry], always)")
 		flRestartPolicy   = cmd.String([]string{"-restart"}, "", "Restart policy to apply when a container exits (no, on-failure[:max-retry], always)")
 		// For documentation purpose
 		// For documentation purpose
+		help = cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
+
 		_ = cmd.Bool([]string{"#sig-proxy", "-sig-proxy"}, true, "Proxy received signals to the process (even in non-TTY mode). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.")
 		_ = cmd.Bool([]string{"#sig-proxy", "-sig-proxy"}, true, "Proxy received signals to the process (even in non-TTY mode). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.")
 		_ = cmd.String([]string{"#name", "-name"}, "", "Assign a name to the container")
 		_ = cmd.String([]string{"#name", "-name"}, "", "Assign a name to the container")
 	)
 	)
@@ -166,9 +169,14 @@ func parseRun(cmd *flag.FlagSet, args []string, sysInfo *sysinfo.SysInfo) (*Conf
 		entrypoint []string
 		entrypoint []string
 		image      string
 		image      string
 	)
 	)
-	if len(parsedArgs) >= 1 {
-		image = cmd.Arg(0)
+
+	if *help {
+		return nil, nil, cmd, nil
+	}
+	if cmd.BadArgs(1) {
+		os.Exit(1)
 	}
 	}
+	image = cmd.Arg(0)
 	if len(parsedArgs) > 1 {
 	if len(parsedArgs) > 1 {
 		runCmd = parsedArgs[1:]
 		runCmd = parsedArgs[1:]
 	}
 	}