瀏覽代碼

c8d/prune: Exclude dangling tag of the images used by containers

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Paweł Gronowski 2 年之前
父節點
當前提交
a93298d4db
共有 2 個文件被更改,包括 36 次插入0 次删除
  1. 3 0
      daemon/containerd/image_prune.go
  2. 33 0
      integration/image/prune_test.go

+ 3 - 0
daemon/containerd/image_prune.go

@@ -95,6 +95,9 @@ func (i *ImageService) pruneUnused(ctx context.Context, filterFunc imageFilterFu
 	var errs error
 	// Exclude images used by existing containers
 	for _, ctr := range containers {
+		// If the original image was deleted, make sure we don't delete the dangling image
+		delete(imagesToPrune, danglingImageName(ctr.ImageID.Digest()))
+
 		// Config.Image is the image reference passed by user.
 		// For example: container created by `docker run alpine` will have Image="alpine"
 		// Warning: This doesn't handle truncated ids:

+ 33 - 0
integration/image/prune_test.go

@@ -0,0 +1,33 @@
+package image
+
+import (
+	"context"
+	"testing"
+
+	"github.com/docker/docker/api/types/filters"
+	"github.com/docker/docker/integration/internal/container"
+	"github.com/docker/docker/testutil/environment"
+	"gotest.tools/v3/assert"
+	is "gotest.tools/v3/assert/cmp"
+	"gotest.tools/v3/skip"
+)
+
+// Regression test for: https://github.com/moby/moby/issues/45732
+func TestPruneDontDeleteUsedDangling(t *testing.T) {
+	skip.If(t, testEnv.DaemonInfo.OSType == "windows", "FIXME: hack/make/.build-empty-images doesn't run on Windows")
+
+	defer setupTest(t)()
+	client := testEnv.APIClient()
+	ctx := context.Background()
+
+	danglingID := environment.GetTestDanglingImageId(testEnv)
+
+	container.Create(ctx, t, client,
+		container.WithImage(danglingID),
+		container.WithCmd("sleep", "60"))
+
+	pruned, err := client.ImagesPrune(ctx, filters.NewArgs(filters.Arg("dangling", "true")))
+
+	assert.NilError(t, err)
+	assert.Check(t, is.Len(pruned.ImagesDeleted, 0))
+}