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