diff --git a/daemon/exec.go b/daemon/exec.go index c27171b4a1..44bdbfe1d3 100644 --- a/daemon/exec.go +++ b/daemon/exec.go @@ -87,22 +87,22 @@ func (d *Daemon) ContainerExec(job *engine.Job) engine.Status { execConfig.StreamConfig.stdinPipe = ioutils.NopWriteCloser(ioutil.Discard) // Silently drop stdin } - var execErr, attachErr chan error - go func() { - attachErr = d.Attach(&execConfig.StreamConfig, config.AttachStdin, false, config.Tty, cStdin, cStdinCloser, cStdout, cStderr) - }() + attachErr := d.Attach(&execConfig.StreamConfig, config.AttachStdin, false, config.Tty, cStdin, cStdinCloser, cStdout, cStderr) + execErr := make(chan error) go func() { err := container.Exec(execConfig) if err != nil { - err = fmt.Errorf("Cannot run in container %s: %s", name, err) + execErr <- fmt.Errorf("Cannot run in container %s: %s", name, err) } - execErr <- err }() select { case err := <-attachErr: - return job.Errorf("attach failed with error: %s", err) + if err != nil { + return job.Errorf("attach failed with error: %s", err) + } + break case err := <-execErr: return job.Error(err) } diff --git a/docs/man/docker-exec.md b/docs/man/docker-exec.md new file mode 100644 index 0000000000..2a6979545b --- /dev/null +++ b/docs/man/docker-exec.md @@ -0,0 +1,29 @@ +% DOCKER(1) Docker User Manuals +% Docker Community +% SEPT 2014 +# NAME +docker-exec - Run a command in an existing container + +# SYNOPSIS +**docker exec** +[**-d**|**--detach**[=*false*]] +[**-i**|**--interactive**[=*false*]] +[**-t**|**--tty**[=*false*]] + CONTAINER COMMAND [ARG...] + +# DESCRIPTION + +Run a process in an existing container. The existing CONTAINER needs is active. + +# Options + +**-d**, **--detach**=*true*|*false* + Detached mode. This runs the new process in the background. + +**-i**, **--interactive**=*true*|*false* + When set to true, keep stdin open even if not attached. The default is false. + +**-t**, **--tty**=*true*|*false* + When set to true Docker can allocate a pseudo-tty and attach to the standard +input of the process. This can be used, for example, to run a throwaway +interactive shell. The default is value is false.