Skip to content

Commit 65edb07

Browse files
committed
Return container exit code with start -a/-i
Addresses moby#8555 Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>
1 parent 528c15a commit 65edb07

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

api/client/commands.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -619,13 +619,13 @@ func (cli *DockerCli) CmdStart(args ...string) error {
619619
return fmt.Errorf("You cannot start and attach multiple containers at once.")
620620
}
621621

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)
623623
if err != nil {
624624
return err
625625
}
626626

627627
env := engine.Env{}
628-
if err := env.Decode(steam); err != nil {
628+
if err := env.Decode(stream); err != nil {
629629
return err
630630
}
631631
config := env.GetSubEnv("Config")
@@ -681,7 +681,16 @@ func (cli *DockerCli) CmdStart(args ...string) error {
681681
log.Errorf("Error monitoring TTY size: %s", err)
682682
}
683683
}
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+
}
685694
}
686695
return nil
687696
}

integration-cli/docker_cli_start_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package main
22

33
import (
4+
"fmt"
45
"os/exec"
6+
"strings"
57
"testing"
68
"time"
79
)
@@ -36,3 +38,33 @@ func TestStartAttachReturnsOnError(t *testing.T) {
3638

3739
logDone("start - error on start with attach exits")
3840
}
41+
42+
// gh#8555: Exit code should be passed through when using start -a
43+
func TestStartAttachCorrectExitCode(t *testing.T) {
44+
defer deleteAllContainers()
45+
46+
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "sh", "-c", "sleep 2; exit 1")
47+
out, _, _, err := runCommandWithStdoutStderr(runCmd)
48+
if err != nil {
49+
t.Fatalf("failed to run container: %v, output: %q", err, out)
50+
}
51+
52+
out = stripTrailingCharacters(out)
53+
54+
// make sure the container has exited before trying the "start -a"
55+
waitCmd := exec.Command(dockerBinary, "wait", out)
56+
if out, _, err = runCommandWithOutput(waitCmd); err != nil {
57+
t.Fatal(out, err)
58+
}
59+
60+
startCmd := exec.Command(dockerBinary, "start", "-a", out)
61+
startOut, exitCode, err := runCommandWithOutput(startCmd)
62+
if err != nil && !strings.Contains("exit status 1", fmt.Sprintf("%s", err)) {
63+
t.Fatalf("start command failed unexpectedly with error: %v, output: %q", err, startOut)
64+
}
65+
if exitCode != 1 {
66+
t.Fatalf("start -a did not respond with proper exit code: expected 1, got %d", exitCode)
67+
}
68+
69+
logDone("start - correct exit code returned with -a")
70+
}

0 commit comments

Comments
 (0)