瀏覽代碼

Implement docker save with standalone client lib.

Signed-off-by: David Calavera <david.calavera@gmail.com>
David Calavera 9 年之前
父節點
當前提交
373f55eecd
共有 2 個文件被更改,包括 26 次插入12 次删除
  1. 20 0
      api/client/lib/image_save.go
  2. 6 12
      api/client/save.go

+ 20 - 0
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
+}

+ 6 - 12
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
 }