remove_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package image // import "github.com/docker/docker/integration/image"
  2. import (
  3. "strings"
  4. "testing"
  5. "github.com/docker/docker/api/types"
  6. containertypes "github.com/docker/docker/api/types/container"
  7. "github.com/docker/docker/errdefs"
  8. "github.com/docker/docker/integration/internal/container"
  9. "gotest.tools/v3/assert"
  10. is "gotest.tools/v3/assert/cmp"
  11. "gotest.tools/v3/skip"
  12. )
  13. func TestRemoveImageOrphaning(t *testing.T) {
  14. ctx := setupTest(t)
  15. client := testEnv.APIClient()
  16. imgName := strings.ToLower(t.Name())
  17. // Create a container from busybox, and commit a small change so we have a new image
  18. cID1 := container.Create(ctx, t, client, container.WithCmd(""))
  19. commitResp1, err := client.ContainerCommit(ctx, cID1, containertypes.CommitOptions{
  20. Changes: []string{`ENTRYPOINT ["true"]`},
  21. Reference: imgName,
  22. })
  23. assert.NilError(t, err)
  24. // verifies that reference now points to first image
  25. resp, _, err := client.ImageInspectWithRaw(ctx, imgName)
  26. assert.NilError(t, err)
  27. assert.Check(t, is.Equal(resp.ID, commitResp1.ID))
  28. // Create a container from created image, and commit a small change with same reference name
  29. cID2 := container.Create(ctx, t, client, container.WithImage(imgName), container.WithCmd(""))
  30. commitResp2, err := client.ContainerCommit(ctx, cID2, containertypes.CommitOptions{
  31. Changes: []string{`LABEL Maintainer="Integration Tests"`},
  32. Reference: imgName,
  33. })
  34. assert.NilError(t, err)
  35. // verifies that reference now points to second image
  36. resp, _, err = client.ImageInspectWithRaw(ctx, imgName)
  37. assert.NilError(t, err)
  38. assert.Check(t, is.Equal(resp.ID, commitResp2.ID))
  39. // try to remove the image, should not error out.
  40. _, err = client.ImageRemove(ctx, imgName, types.ImageRemoveOptions{})
  41. assert.NilError(t, err)
  42. // check if the first image is still there
  43. resp, _, err = client.ImageInspectWithRaw(ctx, commitResp1.ID)
  44. assert.NilError(t, err)
  45. assert.Check(t, is.Equal(resp.ID, commitResp1.ID))
  46. // check if the second image has been deleted
  47. _, _, err = client.ImageInspectWithRaw(ctx, commitResp2.ID)
  48. assert.Check(t, is.ErrorContains(err, "No such image:"))
  49. }
  50. func TestRemoveByDigest(t *testing.T) {
  51. skip.If(t, !testEnv.UsingSnapshotter(), "RepoDigests doesn't include tags when using graphdrivers")
  52. ctx := setupTest(t)
  53. client := testEnv.APIClient()
  54. err := client.ImageTag(ctx, "busybox", "test-remove-by-digest:latest")
  55. assert.NilError(t, err)
  56. inspect, _, err := client.ImageInspectWithRaw(ctx, "test-remove-by-digest")
  57. assert.NilError(t, err)
  58. id := ""
  59. for _, ref := range inspect.RepoDigests {
  60. if strings.Contains(ref, "test-remove-by-digest") {
  61. id = ref
  62. break
  63. }
  64. }
  65. assert.Assert(t, id != "")
  66. t.Logf("removing %s", id)
  67. _, err = client.ImageRemove(ctx, id, types.ImageRemoveOptions{})
  68. assert.NilError(t, err)
  69. inspect, _, err = client.ImageInspectWithRaw(ctx, "busybox")
  70. assert.Check(t, err, "busybox image got deleted")
  71. inspect, _, err = client.ImageInspectWithRaw(ctx, "test-remove-by-digest")
  72. assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
  73. }