aboutsummaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorBrian Goff <cpuguy@hey.com>2022-08-03 15:47:07 -0700
committerGitHub <noreply@github.com>2022-08-03 15:47:07 -0700
commit7e8df0e2c90265b64ae7e9b8023258b719a596d6 (patch)
treec8fbebaad463c4bf4f730605a77d52746a2b123e /daemon
parente60bddcc603f876e58021e69b81acba5b15305e7 (diff)
parent26c65447df6ad86dea98d65f679e3f428ab2ffd3 (diff)
Merge pull request #43820 from thaJeztah/image_delete
containerd integration: Implement ImageDelete for containerd
Diffstat (limited to 'daemon')
-rw-r--r--daemon/containerd/image_delete.go28
-rw-r--r--daemon/image_service.go2
-rw-r--r--daemon/images/image_delete.go3
-rw-r--r--daemon/images/image_prune.go6
4 files changed, 31 insertions, 8 deletions
diff --git a/daemon/containerd/image_delete.go b/daemon/containerd/image_delete.go
index 7ed92a42ce..a88669920b 100644
--- a/daemon/containerd/image_delete.go
+++ b/daemon/containerd/image_delete.go
@@ -1,6 +1,12 @@
package containerd
-import "github.com/docker/docker/api/types"
+import (
+ "context"
+
+ "github.com/containerd/containerd/images"
+ "github.com/docker/distribution/reference"
+ "github.com/docker/docker/api/types"
+)
// ImageDelete deletes the image referenced by the given imageRef from this
// daemon. The given imageRef can be an image ID, ID prefix, or a repository
@@ -35,6 +41,22 @@ import "github.com/docker/docker/api/types"
// If prune is true, ancestor images will each attempt to be deleted quietly,
// meaning any delete conflicts will cause the image to not be deleted and the
// conflict will not be reported.
-func (i *ImageService) ImageDelete(imageRef string, force, prune bool) ([]types.ImageDeleteResponseItem, error) {
- panic("not implemented")
+//
+// TODO(thaJeztah): implement ImageDelete "force" options; see https://github.com/moby/moby/issues/43850
+// TODO(thaJeztah): implement ImageDelete "prune" options; see https://github.com/moby/moby/issues/43849
+// TODO(thaJeztah): add support for image delete using image (short)ID; see https://github.com/moby/moby/issues/43854
+// TODO(thaJeztah): mage delete should send image "untag" events and prometheus counters; see https://github.com/moby/moby/issues/43855
+func (i *ImageService) ImageDelete(ctx context.Context, imageRef string, force, prune bool) ([]types.ImageDeleteResponseItem, error) {
+ parsedRef, err := reference.ParseNormalizedNamed(imageRef)
+ if err != nil {
+ return nil, err
+ }
+ ref := reference.TagNameOnly(parsedRef)
+
+ err = i.client.ImageService().Delete(ctx, ref.String(), images.SynchronousDelete())
+ if err != nil {
+ return nil, err
+ }
+
+ return []types.ImageDeleteResponseItem{{Untagged: reference.FamiliarString(parsedRef)}}, nil
}
diff --git a/daemon/image_service.go b/daemon/image_service.go
index 729ae8cc93..2fe5eddc38 100644
--- a/daemon/image_service.go
+++ b/daemon/image_service.go
@@ -28,7 +28,7 @@ type ImageService interface {
PullImage(ctx context.Context, image, tag string, platform *v1.Platform, metaHeaders map[string][]string, authConfig *registry.AuthConfig, outStream io.Writer) error
PushImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *registry.AuthConfig, outStream io.Writer) error
CreateImage(config []byte, parent string) (builder.Image, error)
- ImageDelete(imageRef string, force, prune bool) ([]types.ImageDeleteResponseItem, error)
+ ImageDelete(ctx context.Context, imageRef string, force, prune bool) ([]types.ImageDeleteResponseItem, error)
ExportImage(names []string, outStream io.Writer) error
LoadImage(inTar io.ReadCloser, outStream io.Writer, quiet bool) error
Images(ctx context.Context, opts types.ImageListOptions) ([]*types.ImageSummary, error)
diff --git a/daemon/images/image_delete.go b/daemon/images/image_delete.go
index 9cad78b87c..b5e1f7d9c3 100644
--- a/daemon/images/image_delete.go
+++ b/daemon/images/image_delete.go
@@ -1,6 +1,7 @@
package images // import "github.com/docker/docker/daemon/images"
import (
+ "context"
"fmt"
"strings"
"time"
@@ -58,7 +59,7 @@ const (
// If prune is true, ancestor images will each attempt to be deleted quietly,
// meaning any delete conflicts will cause the image to not be deleted and the
// conflict will not be reported.
-func (i *ImageService) ImageDelete(imageRef string, force, prune bool) ([]types.ImageDeleteResponseItem, error) {
+func (i *ImageService) ImageDelete(ctx context.Context, imageRef string, force, prune bool) ([]types.ImageDeleteResponseItem, error) {
start := time.Now()
records := []types.ImageDeleteResponseItem{}
diff --git a/daemon/images/image_prune.go b/daemon/images/image_prune.go
index 1d2cd967c3..d3c4608f72 100644
--- a/daemon/images/image_prune.go
+++ b/daemon/images/image_prune.go
@@ -119,7 +119,7 @@ deleteImagesLoop:
if shouldDelete {
for _, ref := range refs {
- imgDel, err := i.ImageDelete(ref.String(), false, true)
+ imgDel, err := i.ImageDelete(ctx, ref.String(), false, true)
if imageDeleteFailed(ref.String(), err) {
continue
}
@@ -128,7 +128,7 @@ deleteImagesLoop:
}
} else {
hex := id.Digest().Hex()
- imgDel, err := i.ImageDelete(hex, false, true)
+ imgDel, err := i.ImageDelete(ctx, hex, false, true)
if imageDeleteFailed(hex, err) {
continue
}
@@ -163,7 +163,7 @@ func imageDeleteFailed(ref string, err error) bool {
switch {
case err == nil:
return false
- case errdefs.IsConflict(err):
+ case errdefs.IsConflict(err), errors.Is(err, context.Canceled), errors.Is(err, context.DeadlineExceeded):
return true
default:
logrus.Warnf("failed to prune image %s: %v", ref, err)