From 3aa4f7f0d71f04c5cc93d5e80cbdd47b0b5fdb7f Mon Sep 17 00:00:00 2001 From: Daniel Nephin Date: Mon, 5 Feb 2018 16:35:47 -0500 Subject: [PATCH] Remove broken container check from image prune The imageRefs map was being popualted with containerID, and accessed with an imageID which would never match. Remove this broken code because: 1) it hasn't ever worked so isn't necessary, and 2) because at best it would be racy ImageDelete() should already handle preventing of removal of used images. Signed-off-by: Daniel Nephin --- daemon/prune.go | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/daemon/prune.go b/daemon/prune.go index 7ed73f0594..eee9e106bd 100644 --- a/daemon/prune.go +++ b/daemon/prune.go @@ -10,6 +10,7 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" timetypes "github.com/docker/docker/api/types/time" + "github.com/docker/docker/errdefs" "github.com/docker/docker/image" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/directory" @@ -193,16 +194,6 @@ func (daemon *Daemon) ImagesPrune(ctx context.Context, pruneFilters filters.Args } else { allImages = daemon.imageStore.Map() } - allContainers := daemon.List() - imageRefs := map[string]bool{} - for _, c := range allContainers { - select { - case <-ctx.Done(): - return nil, ctx.Err() - default: - imageRefs[c.ID] = true - } - } // Filter intermediary images and get their unique size allLayers := make(map[layer.ChainID]layer.Layer) @@ -242,14 +233,8 @@ deleteImagesLoop: default: } - dgst := digest.Digest(id) - hex := dgst.Hex() - if _, ok := imageRefs[hex]; ok { - continue - } - deletedImages := []types.ImageDeleteResponseItem{} - refs := daemon.referenceStore.References(dgst) + refs := daemon.referenceStore.References(id.Digest()) if len(refs) > 0 { shouldDelete := !danglingOnly if !shouldDelete { @@ -268,17 +253,16 @@ deleteImagesLoop: if shouldDelete { for _, ref := range refs { imgDel, err := daemon.ImageDelete(ref.String(), false, true) - if err != nil { - logrus.Warnf("could not delete reference %s: %v", ref.String(), err) + if imageDeleteFailed(ref.String(), err) { continue } deletedImages = append(deletedImages, imgDel...) } } } else { + hex := id.Digest().Hex() imgDel, err := daemon.ImageDelete(hex, false, true) - if err != nil { - logrus.Warnf("could not delete image %s: %v", hex, err) + if imageDeleteFailed(hex, err) { continue } deletedImages = append(deletedImages, imgDel...) @@ -309,6 +293,18 @@ deleteImagesLoop: return rep, nil } +func imageDeleteFailed(ref string, err error) bool { + switch { + case err == nil: + return false + case errdefs.IsConflict(err): + return true + default: + logrus.Warnf("failed to prune image %s: %v", ref, err) + return true + } +} + // localNetworksPrune removes unused local networks func (daemon *Daemon) localNetworksPrune(ctx context.Context, pruneFilters filters.Args) *types.NetworksPruneReport { rep := &types.NetworksPruneReport{}