diff --git a/fs/store.go b/fs/store.go index 36449a0fba..7b8447105a 100644 --- a/fs/store.go +++ b/fs/store.go @@ -92,6 +92,24 @@ func (store *Store) Paths() ([]string, error) { return paths, nil } +func (store *Store) RemoveInPath(pth string) error { + images, err := store.List(pth) + if err != nil { + return err + } + for _, img := range images { + if err = store.Remove(img); err != nil { + return err + } + } + return nil +} + +func (store *Store) Remove(img *Image) error { + _, err := store.orm.Delete(img) + return err +} + func (store *Store) List(pth string) ([]*Image, error) { pth = path.Clean(pth) images, err := store.orm.Select(Image{}, "select images.* from images, paths where Path=? and paths.Image=images.Id", pth) diff --git a/server/server.go b/server/server.go index 18dc578190..07b462d099 100644 --- a/server/server.go +++ b/server/server.go @@ -360,34 +360,36 @@ func (srv *Server) CmdPort(stdin io.ReadCloser, stdout io.Writer, args ...string } // '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 -// } -// if cmd.NArg() < 1 { -// cmd.Usage() -// return nil -// } -// for _, name := range cmd.Args() { -// 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 != nil { -// return err -// } -// } -// return nil -// } +func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string) error { + cmd := rcli.Subcmd(stdout, "rmimage", "[OPTIONS] IMAGE", "Remove an image") + fl_all := cmd.Bool("a", false, "Use IMAGE as a path and remove ALL images in this path") + if err := cmd.Parse(args); err != nil { + cmd.Usage() + return nil + } + if cmd.NArg() < 1 { + cmd.Usage() + return nil + } + for _, name := range cmd.Args() { + var err error + if *fl_all { + err = srv.images.RemoveInPath(name) + } else { + image, err := srv.images.Get(name) + if err != nil { + return err + } else if image == nil { + return errors.New("No such image: " + name) + } + err = srv.images.Remove(image) + } + if err != nil { + return err + } + } + return nil +} func (srv *Server) CmdRm(stdin io.ReadCloser, stdout io.Writer, args ...string) error { cmd := rcli.Subcmd(stdout, "rm", "[OPTIONS] CONTAINER", "Remove a container")