From 044fa103095364b059dc60a7e589607a7af7ed45 Mon Sep 17 00:00:00 2001 From: Kenfe-Mickael Laventure Date: Fri, 20 Jan 2017 13:42:55 -0800 Subject: [PATCH] Prune named but untagged images if danglingOnly=true Signed-off-by: Kenfe-Mickael Laventure --- daemon/prune.go | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/daemon/prune.go b/daemon/prune.go index 40b5718dd8..6f647a205e 100644 --- a/daemon/prune.go +++ b/daemon/prune.go @@ -135,24 +135,29 @@ func (daemon *Daemon) ImagesPrune(pruneFilters filters.Args) (*types.ImagesPrune deletedImages := []types.ImageDelete{} refs := daemon.referenceStore.References(dgst) if len(refs) > 0 { - if danglingOnly { - // Not a dangling image - continue + shouldDelete := !danglingOnly + if !shouldDelete { + hasTag := false + for _, ref := range refs { + if _, ok := ref.(reference.NamedTagged); ok { + hasTag = true + break + } + } + + // Only delete if it's untagged (i.e. repo:) + shouldDelete = !hasTag } - nrRefs := len(refs) - for _, ref := range refs { - // If nrRefs == 1, we have an image marked as myreponame: - // i.e. the tag content was changed - if _, ok := ref.(reference.Canonical); ok && nrRefs > 1 { - continue + 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) + continue + } + deletedImages = append(deletedImages, imgDel...) } - imgDel, err := daemon.ImageDelete(ref.String(), false, true) - if err != nil { - logrus.Warnf("could not delete reference %s: %v", ref.String(), err) - continue - } - deletedImages = append(deletedImages, imgDel...) } } else { imgDel, err := daemon.ImageDelete(hex, false, true)