mirror of https://github.com/docker/docs.git
remove images by name or ID, not always ID
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
This commit is contained in:
parent
b89d07a1cf
commit
2cb0395acf
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue