Преглед изворни кода

docker rmi: remove an image

Solomon Hykes пре 12 година
родитељ
комит
de1c361a6e
2 измењених фајлова са 45 додато и 0 уклоњено
  1. 23 0
      dockerd/dockerd.go
  2. 22 0
      image/image.go

+ 23 - 0
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 {

+ 22 - 0
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{}