Procházet zdrojové kódy

Fix docker commit make a paused container to unpaused. Closes #10932

Signed-off-by: Lei Jitang <leijitang@huawei.com>
Lei Jitang před 10 roky
rodič
revize
7c7c7f84dc
2 změnil soubory, kde provedl 39 přidání a 1 odebrání
  1. 1 1
      daemon/commit.go
  2. 38 0
      integration-cli/docker_cli_commit_test.go

+ 1 - 1
daemon/commit.go

@@ -41,7 +41,7 @@ func (daemon *Daemon) ContainerCommit(job *engine.Job) engine.Status {
 // Commit creates a new filesystem image from the current state of a container.
 // The image can optionally be tagged into a repository
 func (daemon *Daemon) Commit(container *Container, repository, tag, comment, author string, pause bool, config *runconfig.Config) (*image.Image, error) {
-	if pause {
+	if pause && !container.IsPaused() {
 		container.Pause()
 		defer container.Unpause()
 	}

+ 38 - 0
integration-cli/docker_cli_commit_test.go

@@ -72,6 +72,44 @@ func TestCommitWithoutPause(t *testing.T) {
 	logDone("commit - echo foo and commit the image with --pause=false")
 }
 
+//test commit a paused container should not unpause it after commit
+func TestCommitPausedContainer(t *testing.T) {
+	defer deleteAllContainers()
+	defer unpauseAllContainers()
+	cmd := exec.Command(dockerBinary, "run", "-i", "-d", "busybox")
+	out, _, _, err := runCommandWithStdoutStderr(cmd)
+	if err != nil {
+		t.Fatalf("failed to run container: %v, output: %q", err, out)
+	}
+
+	cleanedContainerID := stripTrailingCharacters(out)
+	cmd = exec.Command(dockerBinary, "pause", cleanedContainerID)
+	out, _, _, err = runCommandWithStdoutStderr(cmd)
+	if err != nil {
+		t.Fatalf("failed to pause container: %v, output: %q", err, out)
+	}
+
+	commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID)
+	out, _, err = runCommandWithOutput(commitCmd)
+	if err != nil {
+		t.Fatalf("failed to commit container to image: %s, %v", out, err)
+	}
+	cleanedImageID := stripTrailingCharacters(out)
+	defer deleteImages(cleanedImageID)
+
+	cmd = exec.Command(dockerBinary, "inspect", "-f", "{{.State.Paused}}", cleanedContainerID)
+	out, _, _, err = runCommandWithStdoutStderr(cmd)
+	if err != nil {
+		t.Fatalf("failed to inspect container: %v, output: %q", err, out)
+	}
+
+	if !strings.Contains(out, "true") {
+		t.Fatalf("commit should not unpause a paused container")
+	}
+
+	logDone("commit - commit a paused container will not unpause it")
+}
+
 func TestCommitNewFile(t *testing.T) {
 	defer deleteAllContainers()