Merge pull request #6052 from rhatdan/help

--help option and help command should print to stdout not stderr
This commit is contained in:
Victor Vieux 2014-08-27 11:17:16 -07:00
commit 76fd51a478
38 changed files with 335 additions and 68 deletions

View File

@ -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]) fmt.Fprintf(cli.err, "docker: '%s' is not a docker command. See 'docker --help'.\n", args[0])
return cli.CmdHelp(args[1:]...) 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
} }

View File

@ -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.BadArgs(0) {
if cmd.NArg() > 0 { os.Exit(1)
cmd.Usage()
return nil
} }
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 { if cmd.BadArgs(0) {
cmd.Usage() os.Exit(1)
return nil
} }
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.BadArgs(1) {
if cmd.NArg() != 1 { os.Exit(1)
cmd.Usage()
return nil
} }
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.BadArgs(1) {
if cmd.NArg() != 1 { os.Exit(1)
cmd.Usage()
return nil
} }
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 *help {
if cmd.NArg() != 1 {
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 *help {
if cmd.NArg() != 0 {
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 *help {
if cmd.NArg() != 1 {
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 *help {
if cmd.NArg() != 1 {
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 *help {
if cmd.NArg() != 1 {
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 *help {
if cmd.NArg() != 2 {
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 *help {
if cmd.NArg() != 1 {
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 *help {
if cmd.NArg() != 0 {
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

View File

@ -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

View File

@ -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*.

View File

@ -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*.

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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*.

View File

@ -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*.

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 containers stdout and stderr. then continue streaming new output from the containers 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*.

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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*.

View File

@ -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*.

View File

@ -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.

View File

@ -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

View File

@ -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*.

View File

@ -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*.

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
} }

View File

@ -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:]
} }