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
... | ... |
@@ -30,15 +30,19 @@ var ( |
30 | 30 |
GIT_COMMIT string |
31 | 31 |
) |
32 | 32 |
|
33 |
+func (cli *DockerCli) getMethod(name string) (reflect.Method, bool) { |
|
34 |
+ methodName := "Cmd" + strings.ToUpper(name[:1]) + strings.ToLower(name[1:]) |
|
35 |
+ return reflect.TypeOf(cli).MethodByName(methodName) |
|
36 |
+} |
|
37 |
+ |
|
33 | 38 |
func ParseCommands(args ...string) error { |
34 | 39 |
cli := NewDockerCli("0.0.0.0", 4243) |
35 | 40 |
|
36 | 41 |
if len(args) > 0 { |
37 |
- methodName := "Cmd" + strings.ToUpper(args[0][:1]) + strings.ToLower(args[0][1:]) |
|
38 |
- method, exists := reflect.TypeOf(cli).MethodByName(methodName) |
|
42 |
+ method, exists := cli.getMethod(args[0]) |
|
39 | 43 |
if !exists { |
40 | 44 |
fmt.Println("Error: Command not found:", args[0]) |
41 |
- return cli.CmdHelp(args...) |
|
45 |
+ return cli.CmdHelp(args[1:]...) |
|
42 | 46 |
} |
43 | 47 |
ret := method.Func.CallSlice([]reflect.Value{ |
44 | 48 |
reflect.ValueOf(cli), |
... | ... |
@@ -53,6 +57,18 @@ func ParseCommands(args ...string) error { |
53 | 53 |
} |
54 | 54 |
|
55 | 55 |
func (cli *DockerCli) CmdHelp(args ...string) error { |
56 |
+ if len(args) > 0 { |
|
57 |
+ method, exists := cli.getMethod(args[0]) |
|
58 |
+ if !exists { |
|
59 |
+ fmt.Println("Error: Command not found:", args[0]) |
|
60 |
+ } else { |
|
61 |
+ method.Func.CallSlice([]reflect.Value{ |
|
62 |
+ reflect.ValueOf(cli), |
|
63 |
+ reflect.ValueOf([]string{"--help"}), |
|
64 |
+ })[0].Interface() |
|
65 |
+ return nil |
|
66 |
+ } |
|
67 |
+ } |
|
56 | 68 |
help := "Usage: docker COMMAND [arg...]\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n" |
57 | 69 |
for cmd, description := range map[string]string{ |
58 | 70 |
"attach": "Attach to a running container", |