|
@@ -1061,6 +1061,10 @@ func (cli *DockerCli) CmdAttach(args ...string) error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
+ if !container.State.Running {
|
|
|
+ return fmt.Errorf("Impossible to attach to a stopped container, start it first")
|
|
|
+ }
|
|
|
+
|
|
|
splitStderr := container.Config.Tty
|
|
|
|
|
|
connections := 1
|
|
@@ -1260,16 +1264,6 @@ func (cli *DockerCli) CmdRun(args ...string) error {
|
|
|
fmt.Fprintln(os.Stderr, "WARNING: ", warning)
|
|
|
}
|
|
|
|
|
|
- splitStderr := !config.Tty
|
|
|
-
|
|
|
- connections := 0
|
|
|
- if config.AttachStdin || config.AttachStdout || (!splitStderr && config.AttachStderr) {
|
|
|
- connections += 1
|
|
|
- }
|
|
|
- if splitStderr && config.AttachStderr {
|
|
|
- connections += 1
|
|
|
- }
|
|
|
-
|
|
|
//start the container
|
|
|
_, _, err = cli.call("POST", "/containers/"+out.ID+"/start", nil)
|
|
|
if err != nil {
|
|
@@ -1278,19 +1272,11 @@ func (cli *DockerCli) CmdRun(args ...string) error {
|
|
|
|
|
|
if !config.AttachStdout && !config.AttachStderr {
|
|
|
fmt.Println(out.ID)
|
|
|
- }
|
|
|
- if connections > 0 {
|
|
|
- chErrors := make(chan error, connections)
|
|
|
+ } else {
|
|
|
if config.Tty {
|
|
|
cli.monitorTtySize(out.ID)
|
|
|
}
|
|
|
|
|
|
- if splitStderr && config.AttachStderr {
|
|
|
- go func() {
|
|
|
- chErrors <- cli.hijack("POST", "/containers/"+out.ID+"/attach?logs=1&stream=1&stderr=1", config.Tty, nil, os.Stderr)
|
|
|
- }()
|
|
|
- }
|
|
|
-
|
|
|
v := url.Values{}
|
|
|
v.Set("logs", "1")
|
|
|
v.Set("stream", "1")
|
|
@@ -1301,19 +1287,12 @@ func (cli *DockerCli) CmdRun(args ...string) error {
|
|
|
if config.AttachStdout {
|
|
|
v.Set("stdout", "1")
|
|
|
}
|
|
|
- if !splitStderr && config.AttachStderr {
|
|
|
+ if config.AttachStderr {
|
|
|
v.Set("stderr", "1")
|
|
|
}
|
|
|
- go func() {
|
|
|
- chErrors <- cli.hijack("POST", "/containers/"+out.ID+"/attach?"+v.Encode(), config.Tty, os.Stdin, os.Stdout)
|
|
|
- }()
|
|
|
- for connections > 0 {
|
|
|
- err := <-chErrors
|
|
|
- if err != nil {
|
|
|
- utils.Debugf("Error hijack: %s", err)
|
|
|
- return err
|
|
|
- }
|
|
|
- connections -= 1
|
|
|
+ if err := cli.hijack("POST", "/containers/"+out.ID+"/attach?"+v.Encode(), config.Tty, os.Stdin, os.Stdout); err != nil {
|
|
|
+ utils.Debugf("Error hijack: %s", err)
|
|
|
+ return err
|
|
|
}
|
|
|
}
|
|
|
return nil
|