diff --git a/cli/command/container/run.go b/cli/command/container/run.go index fb3681a9f5..2a11516ab0 100644 --- a/cli/command/container/run.go +++ b/cli/command/container/run.go @@ -136,6 +136,9 @@ func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions ctx, cancelFun := context.WithCancel(context.Background()) + // preserve AutoRemove state. createContainer() / ContainerCreate() disables daemon-side auto-remove on API < 1.25 + autoRemove := hostConfig.AutoRemove + createResponse, err := createContainer(ctx, dockerCli, config, hostConfig, networkingConfig, hostConfig.ContainerIDFile, opts.name) if err != nil { reportError(stderr, cmdPath, err.Error(), true) @@ -207,7 +210,7 @@ func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions }) } - statusChan := waitExitOrRemoved(ctx, dockerCli, createResponse.ID, hostConfig.AutoRemove) + statusChan := waitExitOrRemoved(ctx, dockerCli, createResponse.ID, autoRemove) //start the container if err := client.ContainerStart(ctx, createResponse.ID, types.ContainerStartOptions{}); err != nil { @@ -220,7 +223,7 @@ func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions } reportError(stderr, cmdPath, err.Error(), false) - if hostConfig.AutoRemove { + if autoRemove { // wait container to be removed <-statusChan } diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 9462aef800..f1b1fde121 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -4421,6 +4421,30 @@ func (s *DockerSuite) TestRunRmAndWait(c *check.C) { c.Assert(code, checker.Equals, 0) } +// Test that auto-remove is performed by the daemon (API 1.25 and above) +func (s *DockerSuite) TestRunRm(c *check.C) { + name := "miss-me-when-im-gone" + dockerCmd(c, "run", "--name="+name, "--rm", "busybox") + + _, err := inspectFieldWithError(name, "name") + c.Assert(err, checker.Not(check.IsNil)) + c.Assert(err.Error(), checker.Contains, "No such object: "+name) +} + +// Test that auto-remove is performed by the client on API versions that do not support daemon-side api-remove (API < 1.25) +func (s *DockerSuite) TestRunRmPre125Api(c *check.C) { + name := "miss-me-when-im-gone" + result := icmd.RunCmd(icmd.Cmd{ + Command: binaryWithArgs("run", "--name="+name, "--rm", "busybox"), + Env: appendBaseEnv(false, "DOCKER_API_VERSION=1.24"), + }) + c.Assert(result, icmd.Matches, icmd.Success) + + _, err := inspectFieldWithError(name, "name") + c.Assert(err, checker.Not(check.IsNil)) + c.Assert(err.Error(), checker.Contains, "No such object: "+name) +} + // Test case for #23498 func (s *DockerSuite) TestRunUnsetEntrypoint(c *check.C) { testRequires(c, DaemonIsLinux)