remove_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package container // import "github.com/docker/docker/integration/container"
  2. import (
  3. "context"
  4. "os"
  5. "testing"
  6. "time"
  7. "github.com/docker/docker/api/types"
  8. "github.com/docker/docker/api/types/filters"
  9. "github.com/docker/docker/api/types/volume"
  10. "github.com/docker/docker/errdefs"
  11. "github.com/docker/docker/integration/internal/container"
  12. "gotest.tools/v3/assert"
  13. is "gotest.tools/v3/assert/cmp"
  14. "gotest.tools/v3/fs"
  15. "gotest.tools/v3/poll"
  16. "gotest.tools/v3/skip"
  17. )
  18. func getPrefixAndSlashFromDaemonPlatform() (prefix, slash string) {
  19. if testEnv.DaemonInfo.OSType == "windows" {
  20. return "c:", `\`
  21. }
  22. return "", "/"
  23. }
  24. // Test case for #5244: `docker rm` fails if bind dir doesn't exist anymore
  25. func TestRemoveContainerWithRemovedVolume(t *testing.T) {
  26. skip.If(t, testEnv.IsRemoteDaemon)
  27. defer setupTest(t)()
  28. ctx := context.Background()
  29. apiClient := testEnv.APIClient()
  30. prefix, slash := getPrefixAndSlashFromDaemonPlatform()
  31. tempDir := fs.NewDir(t, "test-rm-container-with-removed-volume", fs.WithMode(0o755))
  32. defer tempDir.Remove()
  33. cID := container.Run(ctx, t, apiClient, container.WithCmd("true"), container.WithBind(tempDir.Path(), prefix+slash+"test"))
  34. poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited"), poll.WithDelay(100*time.Millisecond))
  35. err := os.RemoveAll(tempDir.Path())
  36. assert.NilError(t, err)
  37. err = apiClient.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{
  38. RemoveVolumes: true,
  39. })
  40. assert.NilError(t, err)
  41. _, _, err = apiClient.ContainerInspectWithRaw(ctx, cID, true)
  42. assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
  43. assert.Check(t, is.ErrorContains(err, "No such container"))
  44. }
  45. // Test case for #2099/#2125
  46. func TestRemoveContainerWithVolume(t *testing.T) {
  47. defer setupTest(t)()
  48. ctx := context.Background()
  49. apiClient := testEnv.APIClient()
  50. prefix, slash := getPrefixAndSlashFromDaemonPlatform()
  51. cID := container.Run(ctx, t, apiClient, container.WithCmd("true"), container.WithVolume(prefix+slash+"srv"))
  52. poll.WaitOn(t, container.IsInState(ctx, apiClient, cID, "exited"), poll.WithDelay(100*time.Millisecond))
  53. insp, _, err := apiClient.ContainerInspectWithRaw(ctx, cID, true)
  54. assert.NilError(t, err)
  55. assert.Check(t, is.Equal(1, len(insp.Mounts)))
  56. volName := insp.Mounts[0].Name
  57. err = apiClient.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{
  58. RemoveVolumes: true,
  59. })
  60. assert.NilError(t, err)
  61. volumes, err := apiClient.VolumeList(ctx, volume.ListOptions{
  62. Filters: filters.NewArgs(filters.Arg("name", volName)),
  63. })
  64. assert.NilError(t, err)
  65. assert.Check(t, is.Equal(0, len(volumes.Volumes)))
  66. }
  67. func TestRemoveContainerRunning(t *testing.T) {
  68. defer setupTest(t)()
  69. ctx := context.Background()
  70. apiClient := testEnv.APIClient()
  71. cID := container.Run(ctx, t, apiClient)
  72. err := apiClient.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{})
  73. assert.Check(t, is.ErrorType(err, errdefs.IsConflict))
  74. assert.Check(t, is.ErrorContains(err, "container is running"))
  75. }
  76. func TestRemoveContainerForceRemoveRunning(t *testing.T) {
  77. defer setupTest(t)()
  78. ctx := context.Background()
  79. apiClient := testEnv.APIClient()
  80. cID := container.Run(ctx, t, apiClient)
  81. err := apiClient.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{
  82. Force: true,
  83. })
  84. assert.NilError(t, err)
  85. }
  86. func TestRemoveInvalidContainer(t *testing.T) {
  87. defer setupTest(t)()
  88. ctx := context.Background()
  89. apiClient := testEnv.APIClient()
  90. err := apiClient.ContainerRemove(ctx, "unknown", types.ContainerRemoveOptions{})
  91. assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
  92. assert.Check(t, is.ErrorContains(err, "No such container"))
  93. }