mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 18:28:13 +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,15 +94,20 @@ func (ds *dockerService) RemoveImage(image *runtimeapi.ImageSpec) error { | ||||
| 	imageInspect, err := ds.client.InspectImageByID(image.Image) | ||||
| 	if err == nil && imageInspect != nil && len(imageInspect.RepoTags) > 1 { | ||||
| 		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 nil | ||||
| 	} else if err != nil && libdocker.IsImageNotFoundError(err) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	_, err = ds.client.RemoveImage(image.Image, dockertypes.ImageRemoveOptions{PruneChildren: true}) | ||||
| 	return err | ||||
| 	if err != nil && !libdocker.IsImageNotFoundError(err) { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // getImageRef returns the image digest if exists, or else returns the image ID. | ||||
|   | ||||
| @@ -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) | ||||
| 	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 { | ||||
| 		return nil, ctxErr | ||||
| 	} | ||||
| 	if isImageNotFoundError(err) { | ||||
| 		return nil, ImageNotFoundError{ID: image} | ||||
| 	} | ||||
| 	return resp, err | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Submit Queue
					Kubernetes Submit Queue