diff --git a/api.go b/api.go index 81269ee9d..71b055e09 100644 --- a/api.go +++ b/api.go @@ -15,6 +15,7 @@ import ( "mime" "net" "net/http" + "net/url" "os" "os/exec" "regexp" @@ -622,7 +623,12 @@ func postContainersStart(srv *Server, version float64, w http.ResponseWriter, r if vars == nil { return fmt.Errorf("Missing parameter") } + var err error name := vars["name"] + name, err = url.QueryUnescape(name) + if err != nil { + return err + } if err := srv.ContainerStart(name, hostConfig); err != nil { return err } diff --git a/commands.go b/commands.go index e0bfcea43..4085236ea 100644 --- a/commands.go +++ b/commands.go @@ -558,6 +558,7 @@ func (cli *DockerCli) CmdStart(args ...string) error { var encounteredError error for _, name := range args { + name = strings.Replace(name, "/", "%252F", -1) _, _, err := cli.call("POST", "/containers/"+name+"/start", nil) if err != nil { fmt.Fprintf(cli.err, "%s\n", err) diff --git a/runtime.go b/runtime.go index 0452cf418..f8520f62e 100644 --- a/runtime.go +++ b/runtime.go @@ -67,10 +67,15 @@ func (runtime *Runtime) getContainerElement(id string) *list.Element { // Get looks for a container by the specified ID or name, and returns it. // If the container is not found, or if an error occurs, nil is returned. func (runtime *Runtime) Get(name string) *Container { + if c, _ := runtime.GetByName(name); c != nil { + return c + } + id, err := runtime.idIndex.Get(name) if err != nil { return nil } + e := runtime.getContainerElement(id) if e == nil { return nil @@ -472,11 +477,11 @@ func (runtime *Runtime) GetByName(name string) (*Container, error) { if entity == nil { return nil, fmt.Errorf("Could not find entity for %s", name) } - container := runtime.Get(entity.ID()) - if container == nil { + e := runtime.getContainerElement(entity.ID()) + if e == nil { return nil, fmt.Errorf("Could not find container for entity id %s", entity.ID()) } - return container, nil + return e.Value.(*Container), nil } func (runtime *Runtime) Children(name string) (map[string]*Container, error) {