Sfoglia il codice sorgente

Merge pull request #1225 from dotcloud/hotfix_docker_rmi

*Runtime: improve docker rmi via id
Victor Vieux 12 anni fa
parent
commit
f8dfd0aa5e
1 ha cambiato i file con 15 aggiunte e 2 eliminazioni
  1. 15 2
      server.go

+ 15 - 2
server.go

@@ -870,7 +870,6 @@ func (srv *Server) deleteImageAndChildren(id string, imgs *[]APIRmi) error {
 	if len(srv.runtime.repositories.ByID()[id]) != 0 {
 	if len(srv.runtime.repositories.ByID()[id]) != 0 {
 		return ErrImageReferenced
 		return ErrImageReferenced
 	}
 	}
-
 	// If the image is not referenced but has children, go recursive
 	// If the image is not referenced but has children, go recursive
 	referenced := false
 	referenced := false
 	byParents, err := srv.runtime.graph.ByParent()
 	byParents, err := srv.runtime.graph.ByParent()
@@ -924,8 +923,22 @@ func (srv *Server) deleteImageParents(img *Image, imgs *[]APIRmi) error {
 }
 }
 
 
 func (srv *Server) deleteImage(img *Image, repoName, tag string) ([]APIRmi, error) {
 func (srv *Server) deleteImage(img *Image, repoName, tag string) ([]APIRmi, error) {
-	//Untag the current image
 	imgs := []APIRmi{}
 	imgs := []APIRmi{}
+
+	//If delete by id, see if the id belong only to one repository
+	if strings.Contains(img.ID, repoName) && tag == "" {
+		for _, repoAndTag := range srv.runtime.repositories.ByID()[img.ID] {
+			parsedRepo := strings.Split(repoAndTag, ":")[0]
+			if strings.Contains(img.ID, repoName) {
+				repoName = parsedRepo
+			} else if repoName != parsedRepo {
+				// the id belongs to multiple repos, like base:latest and user:test,
+				// in that case return conflict
+				return imgs, nil
+			}
+		}
+	}
+	//Untag the current image
 	tagDeleted, err := srv.runtime.repositories.Delete(repoName, tag)
 	tagDeleted, err := srv.runtime.repositories.Delete(repoName, tag)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err