diff --git a/api/client/lib/wait.go b/api/client/lib/wait.go new file mode 100644 index 0000000000..70993d84aa --- /dev/null +++ b/api/client/lib/wait.go @@ -0,0 +1,24 @@ +package lib + +import ( + "encoding/json" + + "github.com/docker/docker/api/types" +) + +// ContainerWait pauses execution util a container is exits. +// It returns the API status code as response of its readiness. +func (cli *Client) ContainerWait(containerID string) (int, error) { + resp, err := cli.post("/containers/"+containerID+"/wait", nil, nil, nil) + if err != nil { + return -1, err + } + defer ensureReaderClosed(resp) + + var res types.ContainerWaitResponse + if err := json.NewDecoder(resp.body).Decode(&res); err != nil { + return -1, err + } + + return res.StatusCode, nil +} diff --git a/api/client/run.go b/api/client/run.go index 1ae5d67d7e..8eb463141a 100644 --- a/api/client/run.go +++ b/api/client/run.go @@ -272,7 +272,7 @@ func (cli *DockerCli) CmdRun(args ...string) error { // No Autoremove: Simply retrieve the exit code if !config.Tty { // In non-TTY mode, we can't detach, so we must wait for container exit - if status, err = waitForExit(cli, createResponse.ID); err != nil { + if status, err = cli.client.ContainerWait(createResponse.ID); err != nil { return err } } else { diff --git a/api/client/utils.go b/api/client/utils.go index 7a8a785844..6ccb93d6c3 100644 --- a/api/client/utils.go +++ b/api/client/utils.go @@ -260,22 +260,6 @@ func (cli *DockerCli) resizeTty(id string, isExec bool) { } } -func waitForExit(cli *DockerCli, containerID string) (int, error) { - serverResp, err := cli.call("POST", "/containers/"+containerID+"/wait", nil, nil) - if err != nil { - return -1, err - } - - defer serverResp.body.Close() - - var res types.ContainerWaitResponse - if err := json.NewDecoder(serverResp.body).Decode(&res); err != nil { - return -1, err - } - - return res.StatusCode, nil -} - // getExitCode perform an inspect on the container. It returns // the running state and the exit code. func getExitCode(cli *DockerCli, containerID string) (bool, int, error) { diff --git a/api/client/wait.go b/api/client/wait.go index 3b03f7069e..bd64b83ca2 100644 --- a/api/client/wait.go +++ b/api/client/wait.go @@ -20,7 +20,7 @@ func (cli *DockerCli) CmdWait(args ...string) error { var errNames []string for _, name := range cmd.Args() { - status, err := waitForExit(cli, name) + status, err := cli.client.ContainerWait(name) if err != nil { fmt.Fprintf(cli.err, "%s\n", err) errNames = append(errNames, name)