Skip to content

Commit 74c88fd

Browse files
author
Solomon Hykes
committed
docker rmi -r: remove all images matching a regexp
1 parent 711e29f commit 74c88fd

2 files changed

Lines changed: 38 additions & 4 deletions

File tree

image/image.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"os"
1010
"path"
1111
"path/filepath"
12+
"regexp"
1213
"sort"
1314
"strings"
1415
"time"
@@ -209,6 +210,32 @@ func (index *Index) Delete(name string) error {
209210
return nil
210211
}
211212

213+
// DeleteMatch deletes all images whose name matches `pattern`
214+
func (index *Index) DeleteMatch(pattern string) error {
215+
// Load
216+
if err := index.load(); err != nil {
217+
return err
218+
}
219+
for name, history := range index.ByName {
220+
if match, err := regexp.MatchString(pattern, name); err != nil {
221+
return err
222+
} else if match {
223+
fmt.Printf("Match: %s %s\n", name, pattern)
224+
// Remove from index lookup
225+
for _, image := range *history {
226+
delete(index.ById, image.Id)
227+
}
228+
// Remove from name lookup
229+
delete(index.ByName, name)
230+
}
231+
}
232+
// Save
233+
if err := index.save(); err != nil {
234+
return err
235+
}
236+
return nil
237+
}
238+
212239
func (index *Index) Names() []string {
213240
if err := index.load(); err != nil {
214241
return []string{}

server/server.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ func (srv *Server) CmdInspect(stdin io.ReadCloser, stdout io.Writer, args ...str
314314
// 'docker rmi NAME' removes all images with the name NAME
315315
func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string) error {
316316
cmd := rcli.Subcmd(stdout, "rmimage", "[OPTIONS] IMAGE", "Remove an image")
317+
fl_regexp := cmd.Bool("r", false, "Use IMAGE as a regular expression instead of an exact name")
317318
if err := cmd.Parse(args); err != nil {
318319
cmd.Usage()
319320
return nil
@@ -323,11 +324,17 @@ func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string)
323324
return nil
324325
}
325326
for _, name := range cmd.Args() {
326-
image := srv.images.Find(name)
327-
if image == nil {
328-
return errors.New("No such image: " + name)
327+
var err error
328+
if *fl_regexp {
329+
err = srv.images.DeleteMatch(name)
330+
} else {
331+
image := srv.images.Find(name)
332+
if image == nil {
333+
return errors.New("No such image: " + name)
334+
}
335+
err = srv.images.Delete(name)
329336
}
330-
if err := srv.images.Delete(name); err != nil {
337+
if err != nil {
331338
return err
332339
}
333340
}

0 commit comments

Comments
 (0)