remove images by name or ID, not always ID

Signed-off-by: Victor Vieux <victorvieux@gmail.com>
This commit is contained in:
Victor Vieux 2015-05-14 15:21:18 -07:00
parent b89d07a1cf
commit 2cb0395acf
4 changed files with 36 additions and 33 deletions

View File

@ -477,36 +477,18 @@ func deleteImages(c *context, w http.ResponseWriter, r *http.Request) {
}
var name = mux.Vars(r)["name"]
matchedImages := []*cluster.Image{}
for _, image := range c.cluster.Images() {
if image.Match(name) {
matchedImages = append(matchedImages, image)
}
}
if len(matchedImages) == 0 {
httpError(w, fmt.Sprintf("No such image %s", name), http.StatusNotFound)
out, err := c.cluster.RemoveImages(name)
if err != nil {
httpError(w, err.Error(), http.StatusInternalServerError)
return
}
out := []*dockerclient.ImageDelete{}
errs := []string{}
for _, image := range matchedImages {
content, err := c.cluster.RemoveImage(image)
if err != nil {
errs = append(errs, fmt.Sprintf("%s: %s", image.Engine.Name, err.Error()))
continue
}
out = append(out, content...)
if len(out) == 0 {
httpError(w, fmt.Sprintf("No such image %s", name), http.StatusNotFound)
return
}
if len(errs) != 0 {
httpError(w, strings.Join(errs, ""), http.StatusInternalServerError)
} else {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(NewWriteFlusher(w)).Encode(out)
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(NewWriteFlusher(w)).Encode(out)
}
// GET /_ping

View File

@ -20,8 +20,8 @@ type Cluster interface {
// Return one image matching `IDOrName`
Image(IDOrName string) *Image
// Remove an image from the cluster
RemoveImage(image *Image) ([]*dockerclient.ImageDelete, error)
// Remove images from the cluster
RemoveImages(name string) ([]*dockerclient.ImageDelete, error)
// Return all containers
Containers() []*Container

View File

@ -152,8 +152,8 @@ func (e *Engine) updateSpecs() error {
}
// RemoveImage deletes an image from the engine.
func (e *Engine) RemoveImage(image *Image) ([]*dockerclient.ImageDelete, error) {
return e.client.RemoveImage(image.Id)
func (e *Engine) RemoveImage(image *Image, name string) ([]*dockerclient.ImageDelete, error) {
return e.client.RemoveImage(name)
}
// RefreshImages refreshes the list of images on the engine.

View File

@ -242,11 +242,32 @@ func (c *Cluster) Image(IDOrName string) *cluster.Image {
return nil
}
// RemoveImage removes an image from the cluster
func (c *Cluster) RemoveImage(image *cluster.Image) ([]*dockerclient.ImageDelete, error) {
// RemoveImages removes all the images that match `name` from the cluster
func (c *Cluster) RemoveImages(name string) ([]*dockerclient.ImageDelete, error) {
c.Lock()
defer c.Unlock()
return image.Engine.RemoveImage(image)
out := []*dockerclient.ImageDelete{}
errs := []string{}
var err error
for _, n := range c.engines {
for _, image := range n.Images() {
if image.Match(name) {
content, err := image.Engine.RemoveImage(image, name)
if err != nil {
errs = append(errs, fmt.Sprintf("%s: %s", image.Engine.Name, err.Error()))
continue
}
out = append(out, content...)
}
}
}
if len(errs) > 0 {
err = errors.New(strings.Join(errs, "\n"))
}
return out, err
}
// Pull is exported