mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #45266 from Crazykev/remove-image
Automatic merge from submit-queue (batch tested with PRs 45684, 45266, 45669, 44787, 44984) [CRI] Return success if ImageNotFound in RemoveImage() Signed-off-by: Crazykev <crazykev@zju.edu.cn> **What this PR does / why we need it**: **Sorry for close the [old one](https://github.com/kubernetes/kubernetes/pull/44381) mistakenly, rebase and move to here.** RemoveImage() operation should be idempotent, [ref](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/api/v1alpha1/runtime/api.proto#L89-L92) @feiskyer @Random-Liu PTAL **Which issue this PR fixes** **Special notes for your reviewer**: **Release note**: ```release-note NONE ```
This commit is contained in:
		@@ -94,16 +94,21 @@ func (ds *dockerService) RemoveImage(image *runtimeapi.ImageSpec) error {
 | 
				
			|||||||
	imageInspect, err := ds.client.InspectImageByID(image.Image)
 | 
						imageInspect, err := ds.client.InspectImageByID(image.Image)
 | 
				
			||||||
	if err == nil && imageInspect != nil && len(imageInspect.RepoTags) > 1 {
 | 
						if err == nil && imageInspect != nil && len(imageInspect.RepoTags) > 1 {
 | 
				
			||||||
		for _, tag := range imageInspect.RepoTags {
 | 
							for _, tag := range imageInspect.RepoTags {
 | 
				
			||||||
			if _, err := ds.client.RemoveImage(tag, dockertypes.ImageRemoveOptions{PruneChildren: true}); err != nil {
 | 
								if _, err := ds.client.RemoveImage(tag, dockertypes.ImageRemoveOptions{PruneChildren: true}); err != nil && !libdocker.IsImageNotFoundError(err) {
 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
 | 
						} else if err != nil && libdocker.IsImageNotFoundError(err) {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, err = ds.client.RemoveImage(image.Image, dockertypes.ImageRemoveOptions{PruneChildren: true})
 | 
						_, err = ds.client.RemoveImage(image.Image, dockertypes.ImageRemoveOptions{PruneChildren: true})
 | 
				
			||||||
 | 
						if err != nil && !libdocker.IsImageNotFoundError(err) {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// getImageRef returns the image digest if exists, or else returns the image ID.
 | 
					// getImageRef returns the image digest if exists, or else returns the image ID.
 | 
				
			||||||
func getImageRef(client libdocker.Interface, image string) (string, error) {
 | 
					func getImageRef(client libdocker.Interface, image string) (string, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -129,3 +129,9 @@ func matchImageIDOnly(inspected dockertypes.ImageInspect, image string) bool {
 | 
				
			|||||||
	glog.V(4).Infof("The reference %s does not directly refer to the given image's ID (%q)", image, inspected.ID)
 | 
						glog.V(4).Infof("The reference %s does not directly refer to the given image's ID (%q)", image, inspected.ID)
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// isImageNotFoundError returns whether the err is caused by image not found in docker
 | 
				
			||||||
 | 
					// TODO: Use native error tester once ImageNotFoundError is supported in docker-engine client(eg. ImageRemove())
 | 
				
			||||||
 | 
					func isImageNotFoundError(err error) bool {
 | 
				
			||||||
 | 
						return strings.Contains(err.Error(), "No such image:")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -382,6 +382,9 @@ func (d *kubeDockerClient) RemoveImage(image string, opts dockertypes.ImageRemov
 | 
				
			|||||||
	if ctxErr := contextError(ctx); ctxErr != nil {
 | 
						if ctxErr := contextError(ctx); ctxErr != nil {
 | 
				
			||||||
		return nil, ctxErr
 | 
							return nil, ctxErr
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if isImageNotFoundError(err) {
 | 
				
			||||||
 | 
							return nil, ImageNotFoundError{ID: image}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return resp, err
 | 
						return resp, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user