1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

docker rmi -r: remove all images matching a regexp

This commit is contained in:
Solomon Hykes 2013-03-05 22:39:43 -08:00
parent 711e29fb9b
commit 74c88fdbc0
2 changed files with 38 additions and 4 deletions

View file

@ -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{}

View file

@ -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
}
}