Browse code

Return container exit code with start -a/-i Addresses #8555

Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>

Phil Estes authored on 2014/10/19 11:47:48
Showing 2 changed files
... ...
@@ -619,13 +619,13 @@ func (cli *DockerCli) CmdStart(args ...string) error {
619 619
 			return fmt.Errorf("You cannot start and attach multiple containers at once.")
620 620
 		}
621 621
 
622
-		steam, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, false)
622
+		stream, _, err := cli.call("GET", "/containers/"+cmd.Arg(0)+"/json", nil, false)
623 623
 		if err != nil {
624 624
 			return err
625 625
 		}
626 626
 
627 627
 		env := engine.Env{}
628
-		if err := env.Decode(steam); err != nil {
628
+		if err := env.Decode(stream); err != nil {
629 629
 			return err
630 630
 		}
631 631
 		config := env.GetSubEnv("Config")
... ...
@@ -681,7 +681,16 @@ func (cli *DockerCli) CmdStart(args ...string) error {
681 681
 				log.Errorf("Error monitoring TTY size: %s", err)
682 682
 			}
683 683
 		}
684
-		return <-cErr
684
+		if attchErr := <-cErr; attchErr != nil {
685
+			return attchErr
686
+		}
687
+		_, status, err := getExitCode(cli, cmd.Arg(0))
688
+		if err != nil {
689
+			return err
690
+		}
691
+		if status != 0 {
692
+			return &utils.StatusError{StatusCode: status}
693
+		}
685 694
 	}
686 695
 	return nil
687 696
 }
... ...
@@ -1,7 +1,9 @@
1 1
 package main
2 2
 
3 3
 import (
4
+	"fmt"
4 5
 	"os/exec"
6
+	"strings"
5 7
 	"testing"
6 8
 	"time"
7 9
 )
... ...
@@ -36,3 +38,33 @@ func TestStartAttachReturnsOnError(t *testing.T) {
36 36
 
37 37
 	logDone("start - error on start with attach exits")
38 38
 }
39
+
40
+// gh#8555: Exit code should be passed through when using start -a
41
+func TestStartAttachCorrectExitCode(t *testing.T) {
42
+	defer deleteAllContainers()
43
+
44
+	runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "sh", "-c", "sleep 2; exit 1")
45
+	out, _, _, err := runCommandWithStdoutStderr(runCmd)
46
+	if err != nil {
47
+		t.Fatalf("failed to run container: %v, output: %q", err, out)
48
+	}
49
+
50
+	out = stripTrailingCharacters(out)
51
+
52
+	// make sure the container has exited before trying the "start -a"
53
+	waitCmd := exec.Command(dockerBinary, "wait", out)
54
+	if out, _, err = runCommandWithOutput(waitCmd); err != nil {
55
+		t.Fatal(out, err)
56
+	}
57
+
58
+	startCmd := exec.Command(dockerBinary, "start", "-a", out)
59
+	startOut, exitCode, err := runCommandWithOutput(startCmd)
60
+	if err != nil && !strings.Contains("exit status 1", fmt.Sprintf("%s", err)) {
61
+		t.Fatalf("start command failed unexpectedly with error: %v, output: %q", err, startOut)
62
+	}
63
+	if exitCode != 1 {
64
+		t.Fatalf("start -a did not respond with proper exit code: expected 1, got %d", exitCode)
65
+	}
66
+
67
+	logDone("start - correct exit code returned with -a")
68
+}