remove_test.go 3.0 KB

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