浏览代码

docker rmi -r: remove all images matching a regexp

Solomon Hykes 12 年之前
父节点
当前提交
74c88fdbc0
共有 2 个文件被更改,包括 38 次插入4 次删除
  1. 27 0
      image/image.go
  2. 11 4
      server/server.go

+ 27 - 0
image/image.go

@@ -9,6 +9,7 @@ import (
 	"os"
 	"path"
 	"path/filepath"
+	"regexp"
 	"sort"
 	"strings"
 	"time"
@@ -209,6 +210,32 @@ func (index *Index) Delete(name string) error {
 	return nil
 }
 
+// DeleteMatch deletes all images whose name matches `pattern`
+func (index *Index) DeleteMatch(pattern string) error {
+	// Load
+	if err := index.load(); err != nil {
+		return err
+	}
+	for name, history := range index.ByName {
+		if match, err := regexp.MatchString(pattern, name); err != nil {
+			return err
+		} else if match {
+			fmt.Printf("Match: %s %s\n", name, pattern)
+			// Remove from index lookup
+			for _, image := range *history {
+				delete(index.ById, image.Id)
+			}
+			// Remove from name lookup
+			delete(index.ByName, name)
+		}
+	}
+	// Save
+	if err := index.save(); err != nil {
+		return err
+	}
+	return nil
+}
+
 func (index *Index) Names() []string {
 	if err := index.load(); err != nil {
 		return []string{}

+ 11 - 4
server/server.go

@@ -314,6 +314,7 @@ func (srv *Server) CmdInspect(stdin io.ReadCloser, stdout io.Writer, args ...str
 // '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
@@ -323,11 +324,17 @@ func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string)
 		return nil
 	}
 	for _, name := range cmd.Args() {
-		image := srv.images.Find(name)
-		if image == nil {
-			return errors.New("No such image: " + name)
+		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 := srv.images.Delete(name); err != nil {
+		if err != nil {
 			return err
 		}
 	}