|
@@ -64,6 +64,8 @@ func (cli *DockerCli) CmdHelp(args ...string) error {
|
|
|
method, exists := cli.getMethod(args[0])
|
|
|
if !exists {
|
|
|
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 {
|
|
|
method("--help")
|
|
|
return nil
|
|
@@ -83,13 +85,18 @@ func (cli *DockerCli) CmdBuild(args ...string) error {
|
|
|
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")
|
|
|
pull := cmd.Bool([]string{"-pull"}, false, "Always attempt to pull a newer version of the image")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() != 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
var (
|
|
|
context archive.Archive
|
|
@@ -254,10 +261,16 @@ func (cli *DockerCli) CmdLogin(args ...string) error {
|
|
|
cmd.StringVar(&username, []string{"u", "-username"}, "", "Username")
|
|
|
cmd.StringVar(&password, []string{"p", "-password"}, "", "Password")
|
|
|
cmd.StringVar(&email, []string{"e", "-email"}, "", "Email")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
err := cmd.Parse(args)
|
|
|
if err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
+ if *help {
|
|
|
+ cmd.Usage()
|
|
|
+ return nil
|
|
|
+ }
|
|
|
serverAddress := registry.IndexServerAddress()
|
|
|
if len(cmd.Args()) > 0 {
|
|
|
serverAddress = cmd.Arg(0)
|
|
@@ -390,13 +403,18 @@ func (cli *DockerCli) CmdLogout(args ...string) error {
|
|
|
// 'docker wait': block until a container stops
|
|
|
func (cli *DockerCli) CmdWait(args ...string) error {
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
var encounteredError error
|
|
|
for _, name := range cmd.Args() {
|
|
|
status, err := waitForExit(cli, name)
|
|
@@ -416,10 +434,8 @@ func (cli *DockerCli) CmdVersion(args ...string) error {
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() > 0 {
|
|
|
- cmd.Usage()
|
|
|
- return nil
|
|
|
+ if cmd.BadArgs(flag.Exact, 0) {
|
|
|
+ os.Exit(1)
|
|
|
}
|
|
|
if dockerversion.VERSION != "" {
|
|
|
fmt.Fprintf(cli.out, "Client version: %s\n", dockerversion.VERSION)
|
|
@@ -462,9 +478,8 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() > 0 {
|
|
|
- cmd.Usage()
|
|
|
- return nil
|
|
|
+ if cmd.BadArgs(flag.Exact, 0) {
|
|
|
+ os.Exit(1)
|
|
|
}
|
|
|
|
|
|
body, _, err := readBody(cli.call("GET", "/info", nil, false))
|
|
@@ -579,13 +594,18 @@ func (cli *DockerCli) CmdInfo(args ...string) error {
|
|
|
func (cli *DockerCli) CmdStop(args ...string) error {
|
|
|
cmd := cli.Subcmd("stop", "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.")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
v := url.Values{}
|
|
|
v.Set("t", strconv.Itoa(*nSeconds))
|
|
@@ -606,13 +626,18 @@ func (cli *DockerCli) CmdStop(args ...string) error {
|
|
|
func (cli *DockerCli) CmdRestart(args ...string) error {
|
|
|
cmd := cli.Subcmd("restart", "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.")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
v := url.Values{}
|
|
|
v.Set("t", strconv.Itoa(*nSeconds))
|
|
@@ -664,15 +689,19 @@ func (cli *DockerCli) CmdStart(args ...string) error {
|
|
|
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")
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
hijacked := make(chan io.Closer)
|
|
|
|
|
@@ -778,10 +807,8 @@ func (cli *DockerCli) CmdUnpause(args ...string) error {
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() != 1 {
|
|
|
- cmd.Usage()
|
|
|
- return nil
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
}
|
|
|
|
|
|
var encounteredError error
|
|
@@ -801,10 +828,8 @@ func (cli *DockerCli) CmdPause(args ...string) error {
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() != 1 {
|
|
|
- cmd.Usage()
|
|
|
- return nil
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
}
|
|
|
|
|
|
var encounteredError error
|
|
@@ -822,13 +847,18 @@ func (cli *DockerCli) CmdPause(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")
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
var tmpl *template.Template
|
|
|
if *tmplStr != "" {
|
|
@@ -901,13 +931,18 @@ func (cli *DockerCli) CmdInspect(args ...string) error {
|
|
|
|
|
|
func (cli *DockerCli) CmdTop(args ...string) error {
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() == 0 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
val := url.Values{}
|
|
|
if cmd.NArg() > 1 {
|
|
|
val.Set("ps_args", strings.Join(cmd.Args()[1:], " "))
|
|
@@ -936,13 +971,17 @@ func (cli *DockerCli) CmdTop(args ...string) error {
|
|
|
|
|
|
func (cli *DockerCli) CmdPort(args ...string) error {
|
|
|
cmd := cli.Subcmd("port", "CONTAINER [PRIVATE_PORT[/PROTO]]", "List port mappings for the CONTAINER, or lookup the public-facing port that is NAT-ed to the PRIVATE_PORT")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, false)
|
|
|
if err != nil {
|
|
@@ -995,13 +1034,18 @@ func (cli *DockerCli) CmdRmi(args ...string) error {
|
|
|
force = cmd.Bool([]string{"f", "-force"}, false, "Force removal of the image")
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
v := url.Values{}
|
|
|
if *force {
|
|
@@ -1040,14 +1084,18 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
|
|
|
cmd := cli.Subcmd("history", "IMAGE", "Show the history of an image")
|
|
|
quiet := cmd.Bool([]string{"q", "-quiet"}, false, "Only show numeric IDs")
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() != 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
body, _, err := readBody(cli.call("GET", "/images/"+cmd.Arg(0)+"/history", nil, false))
|
|
|
if err != nil {
|
|
@@ -1098,14 +1146,18 @@ func (cli *DockerCli) CmdRm(args ...string) error {
|
|
|
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")
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
val := url.Values{}
|
|
|
if *v {
|
|
@@ -1136,14 +1188,18 @@ func (cli *DockerCli) CmdRm(args ...string) error {
|
|
|
func (cli *DockerCli) CmdKill(args ...string) error {
|
|
|
cmd := cli.Subcmd("kill", "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")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
var encounteredError error
|
|
|
for _, name := range cmd.Args() {
|
|
@@ -1159,15 +1215,18 @@ func (cli *DockerCli) CmdKill(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.")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
var (
|
|
|
v = url.Values{}
|
|
|
src = cmd.Arg(0)
|
|
@@ -1201,15 +1260,19 @@ func (cli *DockerCli) CmdImport(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")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- name := cmd.Arg(0)
|
|
|
-
|
|
|
- if name == "" {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ name := cmd.Arg(0)
|
|
|
|
|
|
cli.LoadConfigFile()
|
|
|
|
|
@@ -1267,14 +1330,19 @@ func (cli *DockerCli) CmdPush(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")
|
|
|
allTags := cmd.Bool([]string{"a", "-all-tags"}, false, "Download all tagged images in the repository")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() != 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
var (
|
|
|
v = url.Values{}
|
|
|
remote = cmd.Arg(0)
|
|
@@ -1338,6 +1406,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
|
|
|
// 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")
|
|
|
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)
|
|
|
cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values (i.e. 'dangling=true')")
|
|
@@ -1345,10 +1414,13 @@ func (cli *DockerCli) CmdImages(args ...string) error {
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() > 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Max, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
// Consolidate all filter flags, and sanity check them early.
|
|
|
// They'll get process in the daemon/server.
|
|
@@ -1578,6 +1650,7 @@ func (cli *DockerCli) CmdPs(args ...string) error {
|
|
|
quiet = cmd.Bool([]string{"q", "-quiet"}, false, "Only display numeric IDs")
|
|
|
size = cmd.Bool([]string{"s", "-size"}, false, "Display total file sizes")
|
|
|
all = cmd.Bool([]string{"a", "-all"}, false, "Show all containers. Only running containers are shown by default.")
|
|
|
+ help = cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
noTrunc = cmd.Bool([]string{"#notrunc", "-no-trunc"}, false, "Don't truncate output")
|
|
|
nLatest = cmd.Bool([]string{"l", "-latest"}, false, "Show only the latest created container, include non-running ones.")
|
|
|
since = cmd.String([]string{"#sinceId", "#-since-id", "-since"}, "", "Show only containers created since Id or Name, include non-running ones.")
|
|
@@ -1591,7 +1664,10 @@ func (cli *DockerCli) CmdPs(args ...string) error {
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
+ if *help {
|
|
|
+ cmd.Usage()
|
|
|
+ return nil
|
|
|
+ }
|
|
|
if *last == -1 && *nLatest {
|
|
|
*last = 1
|
|
|
}
|
|
@@ -1732,20 +1808,28 @@ func (cli *DockerCli) CmdCommit(args ...string) error {
|
|
|
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.
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
+ if *help {
|
|
|
+ cmd.Usage()
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if cmd.BadArgs(flag.Max, 2) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
var (
|
|
|
name = cmd.Arg(0)
|
|
|
repository, tag = parsers.ParseRepositoryTag(cmd.Arg(1))
|
|
|
)
|
|
|
|
|
|
- if name == "" || len(cmd.Args()) > 2 {
|
|
|
- cmd.Usage()
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
//Check if the given image name can be resolved
|
|
|
if repository != "" {
|
|
|
if _, _, err := registry.ResolveRepositoryName(repository); err != nil {
|
|
@@ -1790,18 +1874,21 @@ func (cli *DockerCli) CmdEvents(args ...string) error {
|
|
|
cmd := cli.Subcmd("events", "", "Get real time events from the server")
|
|
|
since := cmd.String([]string{"#since", "-since"}, "", "Show all events created since timestamp")
|
|
|
until := cmd.String([]string{"-until"}, "", "Stream events until this timestamp")
|
|
|
-
|
|
|
flFilter := opts.NewListOpts(nil)
|
|
|
cmd.Var(&flFilter, []string{"f", "-filter"}, "Provide filter values (i.e. 'event=stop')")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() != 0 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 0) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+
|
|
|
var (
|
|
|
v = url.Values{}
|
|
|
loc = time.FixedZone(time.Now().Zone())
|
|
@@ -1849,14 +1936,18 @@ func (cli *DockerCli) CmdEvents(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")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() != 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
if err := cli.stream("GET", "/containers/"+cmd.Arg(0)+"/export", nil, cli.out, nil); err != nil {
|
|
|
return err
|
|
@@ -1866,13 +1957,18 @@ func (cli *DockerCli) CmdExport(args ...string) error {
|
|
|
|
|
|
func (cli *DockerCli) CmdDiff(args ...string) error {
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() != 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
body, _, err := readBody(cli.call("GET", "/containers/"+cmd.Arg(0)+"/changes", nil, false))
|
|
|
|
|
@@ -1905,16 +2001,20 @@ func (cli *DockerCli) CmdLogs(args ...string) error {
|
|
|
follow = cmd.Bool([]string{"f", "-follow"}, false, "Follow log output")
|
|
|
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)")
|
|
|
+ help = cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
)
|
|
|
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
- if cmd.NArg() != 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
name := cmd.Arg(0)
|
|
|
|
|
|
stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, false)
|
|
@@ -1948,16 +2048,19 @@ func (cli *DockerCli) CmdAttach(args ...string) error {
|
|
|
cmd = cli.Subcmd("attach", "CONTAINER", "Attach to a running container")
|
|
|
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 (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.")
|
|
|
+ help = cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
)
|
|
|
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() != 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
name := cmd.Arg(0)
|
|
|
|
|
|
stream, _, err := cli.call("GET", "/containers/"+name+"/json", nil, false)
|
|
@@ -2027,13 +2130,18 @@ func (cli *DockerCli) CmdSearch(args ...string) error {
|
|
|
trusted := cmd.Bool([]string{"#t", "#trusted", "#-trusted"}, false, "Only show trusted 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")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() != 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
v := url.Values{}
|
|
|
v.Set("term", cmd.Arg(0))
|
|
@@ -2079,13 +2187,18 @@ type ports []int
|
|
|
func (cli *DockerCli) CmdTag(args ...string) error {
|
|
|
cmd := cli.Subcmd("tag", "IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]", "Tag an image into a repository")
|
|
|
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 {
|
|
|
return nil
|
|
|
}
|
|
|
- if cmd.NArg() != 2 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 2) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
var (
|
|
|
repository, tag = parsers.ParseRepositoryTag(cmd.Arg(1))
|
|
@@ -2158,6 +2271,7 @@ func newCIDFile(path string) (*cidFile, error) {
|
|
|
if _, err := os.Stat(path); err == nil {
|
|
|
return nil, fmt.Errorf("Container ID file found, make sure the other container isn't running or delete %s", path)
|
|
|
}
|
|
|
+
|
|
|
f, err := os.Create(path)
|
|
|
if err != nil {
|
|
|
return nil, fmt.Errorf("Failed to create the container ID file: %s", err)
|
|
@@ -2474,14 +2588,18 @@ func (cli *DockerCli) CmdRun(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")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return nil
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() != 2 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 2) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
var copyData engine.Env
|
|
|
info := strings.Split(cmd.Arg(0), ":")
|
|
@@ -2514,16 +2632,20 @@ func (cli *DockerCli) CmdCp(args ...string) error {
|
|
|
|
|
|
func (cli *DockerCli) CmdSave(args ...string) error {
|
|
|
cmd := cli.Subcmd("save", "IMAGE [IMAGE...]", "Save an image(s) to a tar archive (streamed to STDOUT by default)")
|
|
|
- outfile := cmd.String([]string{"o", "-output"}, "", "Write to a file, instead of STDOUT")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
+ outfile := cmd.String([]string{"o", "-output"}, "", "Write to an file, instead of STDOUT")
|
|
|
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- if cmd.NArg() < 1 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Min, 1) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
var (
|
|
|
output io.Writer = cli.out
|
|
@@ -2558,15 +2680,18 @@ func (cli *DockerCli) CmdSave(args ...string) error {
|
|
|
func (cli *DockerCli) CmdLoad(args ...string) error {
|
|
|
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")
|
|
|
+ help := cmd.Bool([]string{"#help", "-help"}, false, "Print usage")
|
|
|
|
|
|
if err := cmd.Parse(args); err != nil {
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
- if cmd.NArg() != 0 {
|
|
|
+ if *help {
|
|
|
cmd.Usage()
|
|
|
return nil
|
|
|
}
|
|
|
+ if cmd.BadArgs(flag.Exact, 0) {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
var (
|
|
|
input io.Reader = cli.in
|
|
@@ -2588,14 +2713,9 @@ func (cli *DockerCli) CmdExec(args ...string) error {
|
|
|
cmd := cli.Subcmd("exec", "CONTAINER COMMAND [ARG...]", "Run a command in a running container")
|
|
|
|
|
|
execConfig, err := runconfig.ParseExec(cmd, args)
|
|
|
- if err != nil {
|
|
|
- cmd.Usage()
|
|
|
+ if execConfig.Container == "" || err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- if execConfig.Container == "" {
|
|
|
- cmd.Usage()
|
|
|
- return nil
|
|
|
- }
|
|
|
|
|
|
stream, _, err := cli.call("POST", "/containers/"+execConfig.Container+"/exec", execConfig, false)
|
|
|
if err != nil {
|