Browse code

Merge pull request #31692 from thaJeztah/17.03.x-fix-autoremove-on-older-api

[17.03.x] fix autoremove on older api

Victor Vieux authored on 2017/03/10 05:18:05
Showing 2 changed files
... ...
@@ -136,6 +136,9 @@ func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions
136 136
 
137 137
 	ctx, cancelFun := context.WithCancel(context.Background())
138 138
 
139
+	// preserve AutoRemove state. createContainer() / ContainerCreate() disables daemon-side auto-remove on API < 1.25
140
+	autoRemove := hostConfig.AutoRemove
141
+
139 142
 	createResponse, err := createContainer(ctx, dockerCli, config, hostConfig, networkingConfig, hostConfig.ContainerIDFile, opts.name)
140 143
 	if err != nil {
141 144
 		reportError(stderr, cmdPath, err.Error(), true)
... ...
@@ -207,7 +210,7 @@ func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions
207 207
 		})
208 208
 	}
209 209
 
210
-	statusChan := waitExitOrRemoved(ctx, dockerCli, createResponse.ID, hostConfig.AutoRemove)
210
+	statusChan := waitExitOrRemoved(ctx, dockerCli, createResponse.ID, autoRemove)
211 211
 
212 212
 	//start the container
213 213
 	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
220 220
 		}
221 221
 
222 222
 		reportError(stderr, cmdPath, err.Error(), false)
223
-		if hostConfig.AutoRemove {
223
+		if autoRemove {
224 224
 			// wait container to be removed
225 225
 			<-statusChan
226 226
 		}
... ...
@@ -4421,6 +4421,30 @@ func (s *DockerSuite) TestRunRmAndWait(c *check.C) {
4421 4421
 	c.Assert(code, checker.Equals, 0)
4422 4422
 }
4423 4423
 
4424
+// Test that auto-remove is performed by the daemon (API 1.25 and above)
4425
+func (s *DockerSuite) TestRunRm(c *check.C) {
4426
+	name := "miss-me-when-im-gone"
4427
+	dockerCmd(c, "run", "--name="+name, "--rm", "busybox")
4428
+
4429
+	_, err := inspectFieldWithError(name, "name")
4430
+	c.Assert(err, checker.Not(check.IsNil))
4431
+	c.Assert(err.Error(), checker.Contains, "No such object: "+name)
4432
+}
4433
+
4434
+// Test that auto-remove is performed by the client on API versions that do not support daemon-side api-remove (API < 1.25)
4435
+func (s *DockerSuite) TestRunRmPre125Api(c *check.C) {
4436
+	name := "miss-me-when-im-gone"
4437
+	result := icmd.RunCmd(icmd.Cmd{
4438
+		Command: binaryWithArgs("run", "--name="+name, "--rm", "busybox"),
4439
+		Env:     appendBaseEnv(false, "DOCKER_API_VERSION=1.24"),
4440
+	})
4441
+	c.Assert(result, icmd.Matches, icmd.Success)
4442
+
4443
+	_, err := inspectFieldWithError(name, "name")
4444
+	c.Assert(err, checker.Not(check.IsNil))
4445
+	c.Assert(err.Error(), checker.Contains, "No such object: "+name)
4446
+}
4447
+
4424 4448
 // Test case for #23498
4425 4449
 func (s *DockerSuite) TestRunUnsetEntrypoint(c *check.C) {
4426 4450
 	testRequires(c, DaemonIsLinux)