浏览代码

Re-enabled docker rmi

shin- 12 年之前
父节点
当前提交
c3622a963d
共有 2 个文件被更改,包括 48 次插入28 次删除
  1. 18 0
      fs/store.go
  2. 30 28
      server/server.go

+ 18 - 0
fs/store.go

@@ -92,6 +92,24 @@ func (store *Store) Paths() ([]string, error) {
 	return paths, nil
 }
 
+func (store *Store) RemoveInPath(pth string) error {
+	images, err := store.List(pth)
+	if err != nil {
+		return err
+	}
+	for _, img := range images {
+		if err = store.Remove(img); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func (store *Store) Remove(img *Image) error {
+	_, err := store.orm.Delete(img)
+	return err
+}
+
 func (store *Store) List(pth string) ([]*Image, error) {
 	pth = path.Clean(pth)
 	images, err := store.orm.Select(Image{}, "select images.* from images, paths where Path=? and paths.Image=images.Id", pth)

+ 30 - 28
server/server.go

@@ -360,34 +360,36 @@ func (srv *Server) CmdPort(stdin io.ReadCloser, stdout io.Writer, args ...string
 }
 
 // 'docker rmi NAME' removes all images with the name NAME
-// func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
-// 	cmd := rcli.Subcmd(stdout, "rmimage", "[OPTIONS] IMAGE", "Remove an image")
-// 	fl_regexp := cmd.Bool("r", false, "Use IMAGE as a regular expression instead of an exact name")
-// 	if err := cmd.Parse(args); err != nil {
-// 		cmd.Usage()
-// 		return nil
-// 	}
-// 	if cmd.NArg() < 1 {
-// 		cmd.Usage()
-// 		return nil
-// 	}
-// 	for _, name := range cmd.Args() {
-// 		var err error
-// 		if *fl_regexp {
-// 			err = srv.images.DeleteMatch(name)
-// 		} else {
-// 			image := srv.images.Find(name)
-// 			if image == nil {
-// 				return errors.New("No such image: " + name)
-// 			}
-// 			err = srv.images.Delete(name)
-// 		}
-// 		if err != nil {
-// 			return err
-// 		}
-// 	}
-// 	return nil
-// }
+func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
+	cmd := rcli.Subcmd(stdout, "rmimage", "[OPTIONS] IMAGE", "Remove an image")
+	fl_all := cmd.Bool("a", false, "Use IMAGE as a path and remove ALL images in this path")
+	if err := cmd.Parse(args); err != nil {
+		cmd.Usage()
+		return nil
+	}
+	if cmd.NArg() < 1 {
+		cmd.Usage()
+		return nil
+	}
+	for _, name := range cmd.Args() {
+		var err error
+		if *fl_all {
+			err = srv.images.RemoveInPath(name)
+		} else {
+			image, err := srv.images.Get(name)
+			if err != nil {
+				return err
+			} else if image == nil {
+				return errors.New("No such image: " + name)
+			}
+			err = srv.images.Remove(image)
+		}
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
 
 func (srv *Server) CmdRm(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
 	cmd := rcli.Subcmd(stdout, "rm", "[OPTIONS] CONTAINER", "Remove a container")