diff --git a/server.go b/server.go index 0adf8aa6cd..676026579c 100644 --- a/server.go +++ b/server.go @@ -1067,15 +1067,16 @@ func (srv *Server) deleteImageParents(img *Image, imgs *[]APIRmi) error { func (srv *Server) deleteImage(img *Image, repoName, tag string) ([]APIRmi, error) { imgs := []APIRmi{} + tags := []string{} //If delete by id, see if the id belong only to one repository - if strings.Contains(img.ID, repoName) && tag == "" { + if repoName == "" { for _, repoAndTag := range srv.runtime.repositories.ByID()[img.ID] { parsedRepo, parsedTag := utils.ParseRepositoryTag(repoAndTag) - if strings.Contains(img.ID, repoName) { + if repoName == "" || repoName == parsedRepo { repoName = parsedRepo - if len(srv.runtime.repositories.ByID()[img.ID]) == 1 && len(parsedTag) > 1 { - tag = parsedTag + if parsedTag != "" { + tags = append(tags, parsedTag) } } else if repoName != parsedRepo { // the id belongs to multiple repos, like base:latest and user:test, @@ -1083,15 +1084,19 @@ func (srv *Server) deleteImage(img *Image, repoName, tag string) ([]APIRmi, erro return imgs, nil } } + } else { + tags = append(tags, tag) } //Untag the current image - tagDeleted, err := srv.runtime.repositories.Delete(repoName, tag) - if err != nil { - return nil, err - } - if tagDeleted { - imgs = append(imgs, APIRmi{Untagged: img.ShortID()}) - srv.LogEvent("untag", img.ShortID(), "") + for _, tag := range tags { + tagDeleted, err := srv.runtime.repositories.Delete(repoName, tag) + if err != nil { + return nil, err + } + if tagDeleted { + imgs = append(imgs, APIRmi{Untagged: img.ShortID()}) + srv.LogEvent("untag", img.ShortID(), "") + } } if len(srv.runtime.repositories.ByID()[img.ID]) == 0 { if err := srv.deleteImageAndChildren(img.ID, &imgs); err != nil { @@ -1118,7 +1123,10 @@ func (srv *Server) ImageDelete(name string, autoPrune bool) ([]APIRmi, error) { } return nil, nil } - + if strings.Contains(img.ID, name) { + //delete via ID + return srv.deleteImage(img, "", "") + } name, tag := utils.ParseRepositoryTag(name) return srv.deleteImage(img, name, tag) }