remove_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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/integration/internal/container"
  10. "gotest.tools/assert"
  11. is "gotest.tools/assert/cmp"
  12. "gotest.tools/fs"
  13. "gotest.tools/poll"
  14. "gotest.tools/skip"
  15. )
  16. func getPrefixAndSlashFromDaemonPlatform() (prefix, slash string) {
  17. if testEnv.OSType == "windows" {
  18. return "c:", `\`
  19. }
  20. return "", "/"
  21. }
  22. // Test case for #5244: `docker rm` fails if bind dir doesn't exist anymore
  23. func TestRemoveContainerWithRemovedVolume(t *testing.T) {
  24. skip.If(t, testEnv.IsRemoteDaemon)
  25. defer setupTest(t)()
  26. ctx := context.Background()
  27. client := testEnv.APIClient()
  28. prefix, slash := getPrefixAndSlashFromDaemonPlatform()
  29. tempDir := fs.NewDir(t, "test-rm-container-with-removed-volume", fs.WithMode(0755))
  30. defer tempDir.Remove()
  31. cID := container.Run(t, ctx, client, container.WithCmd("true"), container.WithBind(tempDir.Path(), prefix+slash+"test"))
  32. poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
  33. err := os.RemoveAll(tempDir.Path())
  34. assert.NilError(t, err)
  35. err = client.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{
  36. RemoveVolumes: true,
  37. })
  38. assert.NilError(t, err)
  39. _, _, err = client.ContainerInspectWithRaw(ctx, cID, true)
  40. assert.Check(t, is.ErrorContains(err, "No such container"))
  41. }
  42. // Test case for #2099/#2125
  43. func TestRemoveContainerWithVolume(t *testing.T) {
  44. defer setupTest(t)()
  45. ctx := context.Background()
  46. client := testEnv.APIClient()
  47. prefix, slash := getPrefixAndSlashFromDaemonPlatform()
  48. cID := container.Run(t, ctx, client, container.WithCmd("true"), container.WithVolume(prefix+slash+"srv"))
  49. poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond))
  50. insp, _, err := client.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 = client.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{
  55. RemoveVolumes: true,
  56. })
  57. assert.NilError(t, err)
  58. volumes, err := client.VolumeList(ctx, filters.NewArgs(filters.Arg("name", volName)))
  59. assert.NilError(t, err)
  60. assert.Check(t, is.Equal(0, len(volumes.Volumes)))
  61. }
  62. func TestRemoveContainerRunning(t *testing.T) {
  63. defer setupTest(t)()
  64. ctx := context.Background()
  65. client := testEnv.APIClient()
  66. cID := container.Run(t, ctx, client)
  67. err := client.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{})
  68. assert.Check(t, is.ErrorContains(err, "cannot remove a running container"))
  69. }
  70. func TestRemoveContainerForceRemoveRunning(t *testing.T) {
  71. defer setupTest(t)()
  72. ctx := context.Background()
  73. client := testEnv.APIClient()
  74. cID := container.Run(t, ctx, client)
  75. err := client.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{
  76. Force: true,
  77. })
  78. assert.NilError(t, err)
  79. }
  80. func TestRemoveInvalidContainer(t *testing.T) {
  81. defer setupTest(t)()
  82. ctx := context.Background()
  83. client := testEnv.APIClient()
  84. err := client.ContainerRemove(ctx, "unknown", types.ContainerRemoveOptions{})
  85. assert.Check(t, is.ErrorContains(err, "No such container"))
  86. }