From d5ca862c98576c7579a169c3d2350d68c3f4f787 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Fri, 1 Feb 2013 00:08:45 -0800 Subject: [PATCH] docker rmi: remove an image Upstream-commit: de1c361a6eea95c867c43619fc1e7a7b8a147750 Component: engine --- components/engine/dockerd/dockerd.go | 23 +++++++++++++++++++++++ components/engine/image/image.go | 22 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/components/engine/dockerd/dockerd.go b/components/engine/dockerd/dockerd.go index c56d5a85c0..a7c5733c1a 100644 --- a/components/engine/dockerd/dockerd.go +++ b/components/engine/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/components/engine/image/image.go b/components/engine/image/image.go index 64c19fbce5..e996ba33b3 100644 --- a/components/engine/image/image.go +++ b/components/engine/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{}