diff --git a/image/image.go b/image/image.go index ebc425db09..1060cf205f 100644 --- a/image/image.go +++ b/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{} diff --git a/server/server.go b/server/server.go index 86fff3dcfe..93d53cd2b7 100644 --- a/server/server.go +++ b/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 } }