diff --git a/api/client/lib/image_save.go b/api/client/lib/image_save.go new file mode 100644 index 0000000000..07d96eb8d3 --- /dev/null +++ b/api/client/lib/image_save.go @@ -0,0 +1,20 @@ +package lib + +import ( + "io" + "net/url" +) + +// ImageSave retrieves one or more images from the docker host as a io.ReadCloser. +// It's up to the caller to store the images and close the stream. +func (cli *Client) ImageSave(imageIDs []string) (io.ReadCloser, error) { + query := url.Values{ + "names": imageIDs, + } + + resp, err := cli.GET("/images/get", query, nil) + if err != nil { + return nil, err + } + return resp.body, nil +} diff --git a/api/client/save.go b/api/client/save.go index f14f9a450c..e7e0166d6f 100644 --- a/api/client/save.go +++ b/api/client/save.go @@ -2,7 +2,7 @@ package client import ( "errors" - "net/url" + "io" "os" Cli "github.com/docker/docker/cli" @@ -35,18 +35,12 @@ func (cli *DockerCli) CmdSave(args ...string) error { } } - sopts := &streamOpts{ - rawTerminal: true, - out: output, - } - - v := url.Values{} - for _, arg := range cmd.Args() { - v.Add("names", arg) - } - if _, err := cli.stream("GET", "/images/get?"+v.Encode(), sopts); err != nil { + responseBody, err := cli.client.ImageSave(cmd.Args()) + if err != nil { return err } + defer responseBody.Close() - return nil + _, err = io.Copy(output, responseBody) + return err }