Docker-DCO-1.1-Signed-off-by: Phil Estes <estesp@linux.vnet.ibm.com>
| ... | ... |
@@ -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 |
+} |