github.com/Heebron/moby@v0.0.0-20221111184709-6eab4f55faf7/integration/container/remove_test.go (about) 1 package container // import "github.com/docker/docker/integration/container" 2 3 import ( 4 "context" 5 "os" 6 "testing" 7 "time" 8 9 "github.com/docker/docker/api/types" 10 "github.com/docker/docker/api/types/filters" 11 "github.com/docker/docker/api/types/volume" 12 "github.com/docker/docker/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.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 defer setupTest(t)() 32 ctx := context.Background() 33 client := testEnv.APIClient() 34 35 prefix, slash := getPrefixAndSlashFromDaemonPlatform() 36 37 tempDir := fs.NewDir(t, "test-rm-container-with-removed-volume", fs.WithMode(0755)) 38 defer tempDir.Remove() 39 40 cID := container.Run(ctx, t, client, container.WithCmd("true"), container.WithBind(tempDir.Path(), prefix+slash+"test")) 41 poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond)) 42 43 err := os.RemoveAll(tempDir.Path()) 44 assert.NilError(t, err) 45 46 err = client.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{ 47 RemoveVolumes: true, 48 }) 49 assert.NilError(t, err) 50 51 _, _, err = client.ContainerInspectWithRaw(ctx, cID, true) 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 defer setupTest(t)() 58 ctx := context.Background() 59 client := testEnv.APIClient() 60 61 prefix, slash := getPrefixAndSlashFromDaemonPlatform() 62 63 cID := container.Run(ctx, t, client, container.WithCmd("true"), container.WithVolume(prefix+slash+"srv")) 64 poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond)) 65 66 insp, _, err := client.ContainerInspectWithRaw(ctx, cID, true) 67 assert.NilError(t, err) 68 assert.Check(t, is.Equal(1, len(insp.Mounts))) 69 volName := insp.Mounts[0].Name 70 71 err = client.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{ 72 RemoveVolumes: true, 73 }) 74 assert.NilError(t, err) 75 76 volumes, err := client.VolumeList(ctx, volume.ListOptions{ 77 Filters: filters.NewArgs(filters.Arg("name", volName)), 78 }) 79 assert.NilError(t, err) 80 assert.Check(t, is.Equal(0, len(volumes.Volumes))) 81 } 82 83 func TestRemoveContainerRunning(t *testing.T) { 84 defer setupTest(t)() 85 ctx := context.Background() 86 client := testEnv.APIClient() 87 88 cID := container.Run(ctx, t, client) 89 90 err := client.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{}) 91 assert.Check(t, is.ErrorContains(err, "cannot remove a running container")) 92 } 93 94 func TestRemoveContainerForceRemoveRunning(t *testing.T) { 95 defer setupTest(t)() 96 ctx := context.Background() 97 client := testEnv.APIClient() 98 99 cID := container.Run(ctx, t, client) 100 101 err := client.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{ 102 Force: true, 103 }) 104 assert.NilError(t, err) 105 } 106 107 func TestRemoveInvalidContainer(t *testing.T) { 108 defer setupTest(t)() 109 ctx := context.Background() 110 client := testEnv.APIClient() 111 112 err := client.ContainerRemove(ctx, "unknown", types.ContainerRemoveOptions{}) 113 assert.Check(t, is.ErrorContains(err, "No such container")) 114 }