mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
615681f517
Signed-off-by: John Howard <jhoward@microsoft.com>
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package client
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/pkg/archive"
|
|
flag "github.com/docker/docker/pkg/mflag"
|
|
)
|
|
|
|
// CmdCp copies files/folders from a path on the container to a directory on the host running the command.
|
|
//
|
|
// If HOSTDIR is '-', the data is written as a tar file to STDOUT.
|
|
//
|
|
// Usage: docker cp CONTAINER:PATH HOSTDIR
|
|
func (cli *DockerCli) CmdCp(args ...string) error {
|
|
cmd := cli.Subcmd("cp", []string{"CONTAINER:PATH HOSTDIR|-"}, "Copy files/folders from a container's PATH to a HOSTDIR on the host\nrunning the command. Use '-' to write the data as a tar file to STDOUT.", true)
|
|
cmd.Require(flag.Exact, 2)
|
|
|
|
cmd.ParseFlags(args, true)
|
|
|
|
// deal with path name with `:`
|
|
info := strings.SplitN(cmd.Arg(0), ":", 2)
|
|
|
|
if len(info) != 2 {
|
|
return fmt.Errorf("Error: Path not specified")
|
|
}
|
|
|
|
cfg := &types.CopyConfig{
|
|
Resource: info[1],
|
|
}
|
|
serverResp, err := cli.call("POST", "/containers/"+info[0]+"/copy", cfg, nil)
|
|
if serverResp.body != nil {
|
|
defer serverResp.body.Close()
|
|
}
|
|
if serverResp.statusCode == 404 {
|
|
return fmt.Errorf("No such container: %v", info[0])
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
hostPath := cmd.Arg(1)
|
|
if serverResp.statusCode == 200 {
|
|
if hostPath == "-" {
|
|
_, err = io.Copy(cli.out, serverResp.body)
|
|
} else {
|
|
err = archive.Untar(serverResp.body, hostPath, &archive.TarOptions{NoLchown: true})
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|