remove_test.go 3.4 KB

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