diff --git a/api/client/cp.go b/api/client/cp.go index 9cc1b3be66..f32e55187f 100644 --- a/api/client/cp.go +++ b/api/client/cp.go @@ -5,7 +5,7 @@ import ( "io" "strings" - "github.com/docker/docker/engine" + "github.com/docker/docker/api/types" "github.com/docker/docker/pkg/archive" flag "github.com/docker/docker/pkg/mflag" ) @@ -21,17 +21,16 @@ func (cli *DockerCli) CmdCp(args ...string) error { cmd.ParseFlags(args, true) - var copyData engine.Env info := strings.Split(cmd.Arg(0), ":") if len(info) != 2 { return fmt.Errorf("Error: Path not specified") } - copyData.Set("Resource", info[1]) - copyData.Set("HostPath", cmd.Arg(1)) - - stream, statusCode, err := cli.call("POST", "/containers/"+info[0]+"/copy", copyData, nil) + cfg := &types.CopyConfig{ + Resource: info[1], + } + stream, statusCode, err := cli.call("POST", "/containers/"+info[0]+"/copy", cfg, nil) if stream != nil { defer stream.Close() } @@ -42,13 +41,12 @@ func (cli *DockerCli) CmdCp(args ...string) error { return err } + hostPath := cmd.Arg(1) if statusCode == 200 { - dest := copyData.Get("HostPath") - - if dest == "-" { + if hostPath == "-" { _, err = io.Copy(cli.out, stream) } else { - err = archive.Untar(stream, dest, &archive.TarOptions{NoLchown: true}) + err = archive.Untar(stream, hostPath, &archive.TarOptions{NoLchown: true}) } if err != nil { return err diff --git a/api/server/server.go b/api/server/server.go index d8b40f02fa..824c3cce7d 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -1203,37 +1203,48 @@ func postContainersCopy(eng *engine.Engine, version version.Version, w http.Resp return fmt.Errorf("Missing parameter") } - var copyData engine.Env - if err := checkForJson(r); err != nil { return err } - if err := copyData.Decode(r.Body); err != nil { + cfg := types.CopyConfig{} + if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil { return err } - if copyData.Get("Resource") == "" { + if cfg.Resource == "" { return fmt.Errorf("Path cannot be empty") } - origResource := copyData.Get("Resource") + res := cfg.Resource - if copyData.Get("Resource")[0] == '/' { - copyData.Set("Resource", copyData.Get("Resource")[1:]) + if res[0] == '/' { + res = res[1:] } - job := eng.Job("container_copy", vars["name"], copyData.Get("Resource")) - job.Stdout.Add(w) - w.Header().Set("Content-Type", "application/x-tar") - if err := job.Run(); err != nil { + cont, err := getDaemon(eng).Get(vars["name"]) + if err != nil { logrus.Errorf("%v", err) if strings.Contains(strings.ToLower(err.Error()), "no such id") { w.WriteHeader(http.StatusNotFound) - } else if strings.Contains(err.Error(), "no such file or directory") { - return fmt.Errorf("Could not find the file %s in container %s", origResource, vars["name"]) + return nil } } + + data, err := cont.Copy(res) + if err != nil { + logrus.Errorf("%v", err) + if os.IsNotExist(err) { + return fmt.Errorf("Could not find the file %s in container %s", cfg.Resource, vars["name"]) + } + return err + } + defer data.Close() + w.Header().Set("Content-Type", "application/x-tar") + if _, err := io.Copy(w, data); err != nil { + return err + } + return nil } diff --git a/api/types/types.go b/api/types/types.go index 36983f68d2..77b211705d 100644 --- a/api/types/types.go +++ b/api/types/types.go @@ -98,3 +98,8 @@ type Container struct { Labels map[string]string `json:",omitempty"` Status string `json:",omitempty"` } + +// POST "/containers/"+containerID+"/copy" +type CopyConfig struct { + Resource string +} diff --git a/daemon/copy.go b/daemon/copy.go deleted file mode 100644 index aaa725263f..0000000000 --- a/daemon/copy.go +++ /dev/null @@ -1,35 +0,0 @@ -package daemon - -import ( - "fmt" - "io" - - "github.com/docker/docker/engine" -) - -func (daemon *Daemon) ContainerCopy(job *engine.Job) error { - if len(job.Args) != 2 { - return fmt.Errorf("Usage: %s CONTAINER RESOURCE\n", job.Name) - } - - var ( - name = job.Args[0] - resource = job.Args[1] - ) - - container, err := daemon.Get(name) - if err != nil { - return err - } - - data, err := container.Copy(resource) - if err != nil { - return err - } - defer data.Close() - - if _, err := io.Copy(job.Stdout, data); err != nil { - return err - } - return nil -} diff --git a/daemon/daemon.go b/daemon/daemon.go index c9b5285f0a..fc94e0a3aa 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -117,7 +117,6 @@ type Daemon struct { func (daemon *Daemon) Install(eng *engine.Engine) error { for name, method := range map[string]engine.Handler{ "commit": daemon.ContainerCommit, - "container_copy": daemon.ContainerCopy, "container_inspect": daemon.ContainerInspect, "container_stats": daemon.ContainerStats, "create": daemon.ContainerCreate,