浏览代码

Upload or download gzipped and bzipped images with put/pull -j/-b

Solomon Hykes 12 年之前
父节点
当前提交
059837c92a
共有 3 个文件被更改,包括 47 次插入8 次删除
  1. 30 4
      dockerd/dockerd.go
  2. 9 2
      image/image.go
  3. 8 2
      image/layers.go

+ 30 - 4
dockerd/dockerd.go

@@ -291,7 +291,20 @@ func (srv *Server) CmdKill(stdin io.ReadCloser, stdout io.Writer, args ...string
 }
 }
 
 
 func (srv *Server) CmdPull(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
 func (srv *Server) CmdPull(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
-	if len(args) < 1 {
+	cmd := rcli.Subcmd(stdout, "pull", "[OPTIONS] NAME", "Download a new image from a remote location")
+	fl_bzip2 := cmd.Bool("j", false, "Bzip2 compression")
+	fl_gzip := cmd.Bool("z", false, "Gzip compression")
+	if err := cmd.Parse(args); err != nil {
+		return nil
+	}
+	var compression image.Compression
+	if *fl_bzip2 {
+		compression = image.Bzip2
+	} else if *fl_gzip {
+		compression = image.Gzip
+	}
+	name := cmd.Arg(0)
+	if name == "" {
 		return errors.New("Not enough arguments")
 		return errors.New("Not enough arguments")
 	}
 	}
 	resp, err := http.Get(args[0])
 	resp, err := http.Get(args[0])
@@ -307,10 +320,23 @@ func (srv *Server) CmdPull(stdin io.ReadCloser, stdout io.Writer, args ...string
 }
 }
 
 
 func (srv *Server) CmdPut(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
 func (srv *Server) CmdPut(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
-	if len(args) < 1 {
+	cmd := rcli.Subcmd(stdout, "put", "[OPTIONS] NAME", "Import a new image from a local archive.")
+	fl_bzip2 := cmd.Bool("j", false, "Bzip2 compression")
+	fl_gzip := cmd.Bool("z", false, "Gzip compression")
+	if err := cmd.Parse(args); err != nil {
+		return nil
+	}
+	var compression image.Compression
+	if *fl_bzip2 {
+		compression = image.Bzip2
+	} else if *fl_gzip {
+		compression = image.Gzip
+	}
+	name := cmd.Arg(0)
+	if name == "" {
 		return errors.New("Not enough arguments")
 		return errors.New("Not enough arguments")
 	}
 	}
-	img, err := srv.images.Import(args[0], stdin, stdout, nil)
+	img, err := srv.images.Import(name, stdin, stdout, nil, compression)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -470,7 +496,7 @@ func (srv *Server) CmdCommit(stdin io.ReadCloser, stdout io.Writer, args ...stri
 		}
 		}
 		// Create a new image from the container's base layers + a new layer from container changes
 		// Create a new image from the container's base layers + a new layer from container changes
 		parentImg := srv.images.Find(container.GetUserData("image"))
 		parentImg := srv.images.Find(container.GetUserData("image"))
-		img, err := srv.images.Import(imgName, rwTar, stdout, parentImg)
+		img, err := srv.images.Import(imgName, rwTar, stdout, parentImg, image.Uncompressed)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}

+ 9 - 2
image/image.go

@@ -41,9 +41,16 @@ func New(root string) (*Store, error) {
 	}, nil
 	}, nil
 }
 }
 
 
+type Compression uint32
 
 
-func (store *Store) Import(name string, archive io.Reader, stderr io.Writer, parent *Image) (*Image, error) {
-	layer, err := store.Layers.AddLayer(archive, stderr)
+const (
+	Uncompressed	Compression = iota
+	Bzip2
+	Gzip
+)
+
+func (store *Store) Import(name string, archive io.Reader, stderr io.Writer, parent *Image, compression Compression) (*Image, error) {
+	layer, err := store.Layers.AddLayer(archive, stderr, compression)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}

+ 8 - 2
image/layers.go

@@ -82,13 +82,19 @@ func (store *LayerStore) layerPath(id string) string {
 }
 }
 
 
 
 
-func (store *LayerStore) AddLayer(archive io.Reader, stderr io.Writer) (string, error) {
+func (store *LayerStore) AddLayer(archive io.Reader, stderr io.Writer, compression Compression) (string, error) {
 	tmp, err := store.Mktemp()
 	tmp, err := store.Mktemp()
 	defer os.RemoveAll(tmp)
 	defer os.RemoveAll(tmp)
 	if err != nil {
 	if err != nil {
 		return "", err
 		return "", err
 	}
 	}
-	untarCmd := exec.Command("tar", "-C", tmp, "-x")
+	extractFlags := "-x"
+	if compression == Bzip2 {
+		extractFlags += "j"
+	} else if compression == Gzip {
+		extractFlags += "z"
+	}
+	untarCmd := exec.Command("tar", "-C", tmp, extractFlags)
 	untarW, err := untarCmd.StdinPipe()
 	untarW, err := untarCmd.StdinPipe()
 	if err != nil {
 	if err != nil {
 		return "", err
 		return "", err