diff --git a/api/client/commands.go b/api/client/commands.go index 1eeb2fdf59..ccab770f58 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -712,6 +712,16 @@ func (cli *DockerCli) CmdStart(args ...string) error { utils.ParseFlags(cmd, args, true) hijacked := make(chan io.Closer) + // Block the return until the chan gets closed + defer func() { + log.Debugf("CmdStart() returned, defer waiting for hijack to finish.") + if _, ok := <-hijacked; ok { + log.Errorf("Hijack did not finish (chan still open)") + } + if *openStdin || *attach { + cli.in.Close() + } + }() if *attach || *openStdin { if cmd.NArg() > 1 { @@ -769,26 +779,19 @@ func (cli *DockerCli) CmdStart(args ...string) error { } } - var encounteredError error for _, name := range cmd.Args() { _, _, err := readBody(cli.call("POST", "/containers/"+name+"/start", nil, false)) if err != nil { if !*attach && !*openStdin { fmt.Fprintf(cli.err, "%s\n", err) } - encounteredError = fmt.Errorf("Error: failed to start one or more containers") + return fmt.Errorf("Error: failed to start one or more containers") } else { if !*attach && !*openStdin { fmt.Fprintf(cli.out, "%s\n", name) } } } - if encounteredError != nil { - if *openStdin || *attach { - cli.in.Close() - } - return encounteredError - } if *openStdin || *attach { if tty && cli.isTerminalOut {