Implemented downloader for the docker communicator so we can pull files out of a container

This commit is contained in:
Chris Bednarski 2015-08-11 22:22:52 -07:00
parent e9c867b66a
commit dc3c55cf8e
1 changed files with 29 additions and 1 deletions

View File

@ -194,8 +194,36 @@ func (c *Communicator) UploadDir(dst string, src string, exclude []string) error
return nil
}
// Download pulls a file out of a container using `docker cp`. We have a source
// path and want to write to an io.Writer, not a file. We use - to make docker
// cp to write to stdout, and then copy the stream to our destination io.Writer.
func (c *Communicator) Download(src string, dst io.Writer) error {
panic("not implemented")
log.Printf("Downloading file from container: %s:%s", c.ContainerId, src)
localCmd := exec.Command("docker", "cp", fmt.Sprintf("%s:%s", c.ContainerId, src), "-")
pipe, err := localCmd.StdoutPipe()
if err != nil {
return fmt.Errorf("Failed to open pipe: %s", err)
}
err = localCmd.Start()
if err != nil {
return fmt.Errorf("Failed to start download: %s", err)
}
numBytes, err := io.Copy(dst, pipe)
if err != nil {
return fmt.Errorf("Failed to pipe download: %s", err)
} else {
log.Printf("Copied %d bytes for %s", numBytes, src)
}
if err = localCmd.Wait(); err != nil {
return fmt.Errorf("Failed to download '%s' from container: %s", src, err)
}
return nil
}
// canExec tells us whether `docker exec` is supported