diff --git a/api/client/commands.go b/api/client/commands.go index f374246a2a..ee52d98946 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -1016,8 +1016,7 @@ func (cli *DockerCli) CmdRm(args ...string) error { cmd := cli.Subcmd("rm", "[OPTIONS] CONTAINER [CONTAINER...]", "Remove one or more containers") v := cmd.Bool([]string{"v", "-volumes"}, false, "Remove the volumes associated with the container") link := cmd.Bool([]string{"l", "#link", "-link"}, false, "Remove the specified link and not the underlying container") - stop := cmd.Bool([]string{"#f", "s", "#-force", "-stop"}, false, "Stop and remove a running container") - kill := cmd.Bool([]string{"k", "-kill"}, false, "Kill and remove a running container") + force := cmd.Bool([]string{"f", "-force"}, false, "Force the removal of a running container (uses SIGKILL)") if err := cmd.Parse(args); err != nil { return nil @@ -1026,9 +1025,7 @@ func (cli *DockerCli) CmdRm(args ...string) error { cmd.Usage() return nil } - if *stop && *kill { - return fmt.Errorf("Conflicting options: -s/--stop and -k/--kill") - } + val := url.Values{} if *v { val.Set("v", "1") @@ -1036,11 +1033,9 @@ func (cli *DockerCli) CmdRm(args ...string) error { if *link { val.Set("link", "1") } - if *stop { - val.Set("stop", "1") - } - if *kill { - val.Set("kill", "1") + + if *force { + val.Set("force", "1") } var encounteredError error diff --git a/api/server/server.go b/api/server/server.go index 858dd4e4d6..3afb8ad87e 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -680,16 +680,8 @@ func deleteContainers(eng *engine.Engine, version version.Version, w http.Respon } job := eng.Job("delete", vars["name"]) - if version.GreaterThanOrEqualTo("1.14") { - job.Setenv("stop", r.Form.Get("stop")) - job.Setenv("kill", r.Form.Get("kill")) + job.Setenv("forceRemove", r.Form.Get("force")) - if job.GetenvBool("stop") && job.GetenvBool("kill") { - return fmt.Errorf("Bad parameters: can't use stop and kill simultaneously") - } - } else { - job.Setenv("stop", r.Form.Get("force")) - } job.Setenv("removeVolume", r.Form.Get("v")) job.Setenv("removeLink", r.Form.Get("link")) if err := job.Run(); err != nil { diff --git a/api/server/server_unit_test.go b/api/server/server_unit_test.go index 5aed3cf346..950fea51d4 100644 --- a/api/server/server_unit_test.go +++ b/api/server/server_unit_test.go @@ -474,30 +474,6 @@ func TestDeleteContainers(t *testing.T) { } } -func TestDeleteContainersWithStopAndKill(t *testing.T) { - if api.APIVERSION.LessThan("1.14") { - return - } - eng := engine.New() - var called bool - eng.Register("delete", func(job *engine.Job) engine.Status { - called = true - return engine.StatusOK - }) - r := serveRequest("DELETE", "/containers/foo?stop=1&kill=1", nil, eng, t) - if r.Code != http.StatusBadRequest { - t.Fatalf("Got status %d, expected %d", r.Code, http.StatusBadRequest) - } - if called { - t.Fatalf("container_delete jobs was called, but it shouldn't") - } - res := strings.TrimSpace(r.Body.String()) - expected := "Bad parameters: can't use stop and kill simultaneously" - if !strings.Contains(res, expected) { - t.Fatalf("Output %s, expected %s in it", res, expected) - } -} - func serveRequest(method, target string, body io.Reader, eng *engine.Engine, t *testing.T) *httptest.ResponseRecorder { return serveRequestUsingVersion(method, target, api.APIVERSION, body, eng, t) } diff --git a/daemon/delete.go b/daemon/delete.go index ad4df69860..fdd62924d9 100644 --- a/daemon/delete.go +++ b/daemon/delete.go @@ -20,9 +20,7 @@ func (daemon *Daemon) ContainerDestroy(job *engine.Job) engine.Status { name := job.Args[0] removeVolume := job.GetenvBool("removeVolume") removeLink := job.GetenvBool("removeLink") - stop := job.GetenvBool("stop") - kill := job.GetenvBool("kill") - + forceRemove := job.GetenvBool("forceRemove") container := daemon.Get(name) if removeLink { @@ -55,11 +53,7 @@ func (daemon *Daemon) ContainerDestroy(job *engine.Job) engine.Status { if container != nil { if container.State.IsRunning() { - if stop { - if err := container.Stop(5); err != nil { - return job.Errorf("Could not stop running container, cannot remove - %v", err) - } - } else if kill { + if forceRemove { if err := container.Kill(); err != nil { return job.Errorf("Could not kill running container, cannot remove - %v", err) } diff --git a/docs/man/docker-rm.1.md b/docs/man/docker-rm.1.md index 87a07a8849..e73231e907 100644 --- a/docs/man/docker-rm.1.md +++ b/docs/man/docker-rm.1.md @@ -6,9 +6,8 @@ docker-rm - Remove one or more containers # SYNOPSIS **docker rm** -[**-k**|**--kill**[=*false*]] [**-l**|**--link**[=*false*]] -[**-s**|**--stop**[=*false*]] +[**-f**|**--force**[=*false*]] [**-v**|**--volumes**[=*false*]] CONTAINER [CONTAINER...] @@ -20,15 +19,11 @@ remove a running container unless you use the \fB-f\fR option. To see all containers on a host use the **docker ps -a** command. # OPTIONS -**-k**, **--kill**=*true*|*false* - Kill and remove a running container. The default is *false*. - **-l**, **--link**=*true*|*false* Remove the specified link and not the underlying container. The default is *false*. -**-s**, **--stop**=*true*|*false* - Stop and remove a running container. The default is *false*. - +**-f**, **--force**=*true*|*false* + Allows removing of a running container by first killing it with SIGKILL. **-v**, **--volumes**=*true*|*false* Remove the volumes associated with the container. The default is *false*. diff --git a/docs/sources/reference/api/docker_remote_api.md b/docs/sources/reference/api/docker_remote_api.md index e968b2a3cc..e712f864f2 100644 --- a/docs/sources/reference/api/docker_remote_api.md +++ b/docs/sources/reference/api/docker_remote_api.md @@ -37,11 +37,7 @@ You can still call an old version of the API using `DELETE /containers/(id)` **New!** -You can now use the `stop` parameter to stop running containers before removal -(replace `force`). - -**New!** -You can now use the `kill` parameter to kill running containers before removal. +When using `force`, the container will be immediately killed with SIGKILL. `POST /containers/(id)/start` diff --git a/docs/sources/reference/api/docker_remote_api_v1.14.md b/docs/sources/reference/api/docker_remote_api_v1.14.md index 35f26c56df..e411c8c6ef 100644 --- a/docs/sources/reference/api/docker_remote_api_v1.14.md +++ b/docs/sources/reference/api/docker_remote_api_v1.14.md @@ -679,9 +679,7 @@ Remove the container `id` from the filesystem - **v** – 1/True/true or 0/False/false, Remove the volumes associated to the container. Default false - - **stop** – 1/True/true or 0/False/false, Stop then remove the container. - Default false - - **kill** - 1/True/true or 0/False/false, Kill then remove the container. + - **force** - 1/True/true or 0/False/false, Kill then remove the container. Default false Status Codes: diff --git a/docs/sources/reference/commandline/cli.md b/docs/sources/reference/commandline/cli.md index 83cd56a206..3ee0c81761 100644 --- a/docs/sources/reference/commandline/cli.md +++ b/docs/sources/reference/commandline/cli.md @@ -864,8 +864,7 @@ registry or to a self-hosted one. Remove one or more containers - -s, --stop=false Stop and remove a running container - -k, --kill=false Kill and remove a running container + -f, --force=false Force removal of a running container. Uses SIGKILL to stop the container. -l, --link=false Remove the specified link and not the underlying container -v, --volumes=false Remove the volumes associated with the container @@ -890,21 +889,12 @@ This will remove the underlying link between `/webapp` and the `/redis` containers removing all network communication. - $ sudo docker rm --stop redis - redis - -The main process inside the container referenced under the link `/redis` will receive -SIGTERM, and after a grace period, SIGKILL, then the container will be removed. - - $ sudo docker rm --kill redis + $ sudo docker rm --force redis redis The main process inside the container referenced under the link `/redis` will receive SIGKILL, then the container will be removed. -NOTE: If you try to use `stop` and `kill` simultaneously, Docker will return an error. - - $ sudo docker rm $(docker ps -a -q) This command will delete all stopped containers. The command `docker ps -a -q` will return all existing container diff --git a/integration-cli/docker_cli_rm_test.go b/integration-cli/docker_cli_rm_test.go index 08bc2a7224..6b395c5218 100644 --- a/integration-cli/docker_cli_rm_test.go +++ b/integration-cli/docker_cli_rm_test.go @@ -57,40 +57,18 @@ func TestRemoveRunningContainer(t *testing.T) { logDone("rm - running container") } -func TestStopAndRemoveRunningContainer(t *testing.T) { +func TestForceRemoveRunningContainer(t *testing.T) { createRunningContainer(t, "foo") // Stop then remove with -s - cmd := exec.Command(dockerBinary, "rm", "-s", "foo") + cmd := exec.Command(dockerBinary, "rm", "-f", "foo") if _, err := runCommand(cmd); err != nil { t.Fatal(err) } deleteAllContainers() - logDone("rm - running container with --stop=true") -} - -func TestKillAndRemoveRunningContainer(t *testing.T) { - createRunningContainer(t, "foo") - - // Kill then remove with -k - cmd := exec.Command(dockerBinary, "rm", "-k", "foo") - if _, err := runCommand(cmd); err != nil { - t.Fatal(err) - } - - deleteAllContainers() - - logDone("rm - running container with --kill=true") -} - -func TestRemoveContainerWithStopAndKill(t *testing.T) { - cmd := exec.Command(dockerBinary, "rm", "-sk", "foo") - if _, err := runCommand(cmd); err == nil { - t.Fatalf("Expected error: can't use stop and kill simulteanously") - } - logDone("rm - with --stop=true and --kill=true") + logDone("rm - running container with --force=true") } func TestContainerOrphaning(t *testing.T) {