From 31c98bdaafd806d7c5e44f2ed25cf57e7ef20827 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Thu, 23 May 2013 16:32:39 +0000 Subject: [PATCH] bring Error: Command not found: Usage: docker COMMAND [arg...] A self-sufficient runtime for linux containers. Commands: attach Attach to a running container insert Insert a file in an image login Register or Login to the docker registry server export Stream the contents of a container as a tar archive diff Inspect changes on a container's filesystem logs Fetch the logs of a container pull Pull an image or a repository from the docker registry server restart Restart a running container build Build a container from Dockerfile or via stdin history Show the history of an image kill Kill a running container rmi Remove an image start Start a stopped container tag Tag an image into a repository commit Create a new image from a container's changes import Create a new filesystem image from the contents of a tarball ps List containers rm Remove a container run Run a command in a new container wait Block until a container stops, then print its exit code images List images port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT info Display system-wide information inspect Return low-level information on a container push Push an image or a repository to the docker registry server search Search for an image in the docker index stop Stop a running container version Show the docker version information back --- commands.go | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/commands.go b/commands.go index 5e459a1d94..16dfdbfc2b 100644 --- a/commands.go +++ b/commands.go @@ -30,15 +30,19 @@ var ( GIT_COMMIT string ) +func (cli *DockerCli) getMethod(name string) (reflect.Method, bool) { + methodName := "Cmd" + strings.ToUpper(name[:1]) + strings.ToLower(name[1:]) + return reflect.TypeOf(cli).MethodByName(methodName) +} + func ParseCommands(args ...string) error { cli := NewDockerCli("0.0.0.0", 4243) if len(args) > 0 { - methodName := "Cmd" + strings.ToUpper(args[0][:1]) + strings.ToLower(args[0][1:]) - method, exists := reflect.TypeOf(cli).MethodByName(methodName) + method, exists := cli.getMethod(args[0]) if !exists { fmt.Println("Error: Command not found:", args[0]) - return cli.CmdHelp(args...) + return cli.CmdHelp(args[1:]...) } ret := method.Func.CallSlice([]reflect.Value{ reflect.ValueOf(cli), @@ -53,6 +57,18 @@ func ParseCommands(args ...string) error { } func (cli *DockerCli) CmdHelp(args ...string) error { + if len(args) > 0 { + method, exists := cli.getMethod(args[0]) + if !exists { + fmt.Println("Error: Command not found:", args[0]) + } else { + method.Func.CallSlice([]reflect.Value{ + reflect.ValueOf(cli), + reflect.ValueOf([]string{"--help"}), + })[0].Interface() + return nil + } + } help := "Usage: docker COMMAND [arg...]\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n" for cmd, description := range map[string]string{ "attach": "Attach to a running container",