diff --git a/dockerd/dockerd.go b/dockerd/dockerd.go index c56d5a85c0..a7c5733c1a 100644 --- a/dockerd/dockerd.go +++ b/dockerd/dockerd.go @@ -222,6 +222,29 @@ func (srv *Server) CmdInspect(stdin io.ReadCloser, stdout io.Writer, args ...str return nil } +// '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") + if err := cmd.Parse(args); err != nil { + cmd.Usage() + return nil + } + if cmd.NArg() < 1 { + cmd.Usage() + return nil + } + for _, name := range cmd.Args() { + image := srv.images.Find(name) + if image == nil { + return errors.New("No such image: " + name) + } + if err := srv.images.Delete(name); err != nil { + return err + } + } + return nil +} + func (srv *Server) CmdRm(stdin io.ReadCloser, stdout io.Writer, args ...string) error { flags := rcli.Subcmd(stdout, "rm", "[OPTIONS] CONTAINER", "Remove a container") if err := flags.Parse(args); err != nil { diff --git a/image/image.go b/image/image.go index 64c19fbce5..e996ba33b3 100644 --- a/image/image.go +++ b/image/image.go @@ -186,6 +186,28 @@ func (index *Index) Rename(oldName, newName string) error { return nil } +// Delete deletes all images with the name `name` +func (index *Index) Delete(name string) error { + // Load + if err := index.load(); err != nil { + return err + } + if _, exists := index.ByName[name]; !exists { + return errors.New("No such image: " + name) + } + // Remove from index lookup + for _, image := range *index.ByName[name] { + 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{}