Browse Source

Implement docker wait with standalone client lib.

Signed-off-by: David Calavera <david.calavera@gmail.com>
David Calavera 9 năm trước cách đây
mục cha
commit
51efb1480a
4 tập tin đã thay đổi với 26 bổ sung18 xóa
  1. 24 0
      api/client/lib/wait.go
  2. 1 1
      api/client/run.go
  3. 0 16
      api/client/utils.go
  4. 1 1
      api/client/wait.go

+ 24 - 0
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
+}

+ 1 - 1
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 {

+ 0 - 16
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) {

+ 1 - 1
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)