Java源码示例:com.github.dockerjava.api.command.ExecCreateCmdResponse

示例1
private TestExecStartResultCallback executeCommandInDocker(String containerName, String[] command,
    boolean expectedToSucceed) throws Exception {
  Container sparkWorkerContainer = runningContainers.get(containerName);
  ExecCreateCmd cmd = dockerClient.execCreateCmd(sparkWorkerContainer.getId()).withCmd(command).withAttachStdout(true)
      .withAttachStderr(true);

  ExecCreateCmdResponse createCmdResponse = cmd.exec();
  TestExecStartResultCallback callback =
      new TestExecStartResultCallback(new ByteArrayOutputStream(), new ByteArrayOutputStream());
  dockerClient.execStartCmd(createCmdResponse.getId()).withDetach(false).withTty(false).exec(callback)
      .awaitCompletion();
  int exitCode = dockerClient.inspectExecCmd(createCmdResponse.getId()).exec().getExitCode();
  LOG.info("Exit code for command : " + exitCode);
  LOG.error("\n\n ###### Stdout #######\n" + callback.getStdout().toString());
  LOG.error("\n\n ###### Stderr #######\n" + callback.getStderr().toString());

  if (expectedToSucceed) {
    assertEquals(0, exitCode, "Command (" + Arrays.toString(command) + ") expected to succeed. Exit (" + exitCode + ")");
  } else {
    assertNotEquals(0, exitCode, "Command (" + Arrays.toString(command) + ") expected to fail. Exit (" + exitCode + ")");
  }
  cmd.close();
  return callback;
}
 
示例2
@Override
public Boolean call() throws Exception {
    ExecCreateCmdResponse execResponse = getDockerClient().execCreateCmd(containerId)
            .withCmd("ls", "-R", dataDirectory)
            .withTty(true)
            .withAttachStdout(true)
            .withAttachStderr(true)
            .exec();
    try (InputStream inputstream = getDockerClient().execStartCmd(containerId).withTty(true).withExecId(execResponse.getId()).exec(null)) {
        String contents = IOUtils.toString(inputstream, Charset.defaultCharset()).replaceAll("\\p{C}", "");
        LOGGER.info("Contents of " + dataDirectory + ": " + contents);
        return contents.contains("S0") && contents.contains("S1") && contents.contains("S2");
    } catch (IOException e) {
        LOGGER.error("Could not list contents of " + dataDirectory + " in Mesos-Local");
        return false;
    }
}
 
示例3
public String execCommand(String containerId, boolean awaitCompletion, String... command) {
  ExecCreateCmdResponse exec = client.execCreateCmd(containerId).withCmd(command).withTty(false)
      .withAttachStdin(true).withAttachStdout(true).withAttachStderr(true).exec();
  ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  String output = null;
  try {
    ExecStartResultCallback resultCallback = client.execStartCmd(exec.getId()).withDetach(false)
        .withTty(true).exec(new ExecStartResultCallback(outputStream, System.err));
    if (awaitCompletion) {
        resultCallback.awaitCompletion();
    }
    output = new String(outputStream.toByteArray());
  } catch (InterruptedException e) {
    log.warn("Exception executing command {} on container {}", Arrays.toString(command),
        containerId, e);
  }

  return output;
}
 
示例4
public void execCommand( String command ) throws Exception {
        // Exec command inside running container with attached STDOUT and STDERR
        String[] commandArray = StringUtilities.parseCommand(command);

        ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(containerId)//
                .withAttachStdout(true) //
                .withAttachStderr(true)//
                .withCmd(commandArray)//
                .withUser("root")//
                .exec();
        dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(new ExecStartResultCallback(System.out, System.err))
                .awaitCompletion();

//            pm.message(execOutput);

    }
 
示例5
@Test
public void execStartAttached() throws Exception {
    String containerName = "generated_" + new SecureRandom().nextInt();

    CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999")
            .withName(containerName).exec();
    LOG.info("Created container {}", container.toString());
    assertThat(container.getId(), not(is(emptyString())));

    dockerRule.getClient().startContainerCmd(container.getId()).exec();

    ExecCreateCmdResponse execCreateCmdResponse = dockerRule.getClient().execCreateCmd(container.getId())
            .withAttachStdout(true).withCmd("touch", "/execStartTest.log").exec();
    dockerRule.getClient().execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true)
            .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion();

    InputStream response = dockerRule.getClient().copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec();

    // read the stream fully. Otherwise, the underlying stream will not be closed.
    String responseAsString = asString(response);
    assertNotNull(responseAsString);
    assertTrue(responseAsString.length() > 0);
}
 
示例6
@Test(expected = NotFoundException.class)
public void execStartWithNonExistentUser() throws Exception {
    String containerName = "generated_" + new SecureRandom().nextInt();

    CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999")
            .withName(containerName).exec();
    LOG.info("Created container {}", container.toString());
    assertThat(container.getId(), not(is(emptyString())));

    dockerRule.getClient().startContainerCmd(container.getId()).exec();

    ExecCreateCmdResponse execCreateCmdResponse = dockerRule.getClient().execCreateCmd(container.getId())
            .withAttachStdout(true).withCmd("touch", "/execStartTest.log").withUser("NonExistentUser").exec();
    dockerRule.getClient().execStartCmd(execCreateCmdResponse.getId()).withDetach(false).withTty(true)
            .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion();

    dockerRule.getClient().copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec();
}
 
示例7
private void startZookeeper() {
    LOGGER.info("Starting zookeeper...");
    LOGGER.info("Executing command in container with Id {}", getContainerId());

    ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(getContainerId())
        .withCmd("bash", "-c", "bin/zookeeper-server-start.sh config/zookeeper.properties &")
        .exec();

    try {
        dockerClient.execStartCmd(execCreateCmdResponse.getId()).start().awaitCompletion(10, TimeUnit.SECONDS);

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
 
示例8
private void startKafka() {
    LOGGER.info("Starting kafka...");

    ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(getContainerId())
        .withCmd("bash", "-c", "bin/kafka-server-start.sh config/server.properties --override listeners=BROKER://0.0.0.0:9093,PLAINTEXT://0.0.0.0:" + KAFKA_PORT + "  --override advertised.listeners=" + advertisedListeners.toString() + " --override zookeeper.connect=localhost:" + ZOOKEEPER_PORT + " --override listener.security.protocol.map=BROKER:PLAINTEXT,PLAINTEXT:PLAINTEXT --override inter.broker.listener.name=BROKER &")
        .exec();

    try {
        dockerClient.execStartCmd(execCreateCmdResponse.getId()).start().awaitCompletion(10, TimeUnit.SECONDS);

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
 
示例9
@Override
public ProcessResult executeInContainerAsUser(ContainerName containerName, String user, OptionalLong timeoutSeconds, String... command) {
    try {
        ExecCreateCmdResponse response = execCreateCmd(containerName, user, command);

        ByteArrayOutputStream output = new ByteArrayOutputStream();
        ByteArrayOutputStream errors = new ByteArrayOutputStream();
        ExecStartResultCallback callback = dockerClient.execStartCmd(response.getId())
                .exec(new ExecStartResultCallback(output, errors));

        if (timeoutSeconds.isPresent()) {
            if (!callback.awaitCompletion(timeoutSeconds.getAsLong(), TimeUnit.SECONDS))
                throw new DockerExecTimeoutException(String.format(
                        "Command '%s' did not finish within %d seconds.", command[0], timeoutSeconds.getAsLong()));
        } else {
            // Wait for completion no timeout
            callback.awaitCompletion();
        }

        InspectExecResponse state = dockerClient.inspectExecCmd(response.getId()).exec();
        if (state.isRunning())
            throw new DockerException("Command '%s' did not finish within %s seconds.");

        return new ProcessResult(state.getExitCode(), new String(output.toByteArray()), new String(errors.toByteArray()));
    } catch (RuntimeException | InterruptedException e) {
        numberOfDockerApiFails.increment();
        throw new DockerException("Container '" + containerName.asString()
                + "' failed to execute " + Arrays.toString(command), e);
    }
}
 
示例10
private ExecCreateCmdResponse execCreateCmd(ContainerName containerName, String user, String... command) {
    try {
        return dockerClient.execCreateCmd(containerName.asString())
                .withCmd(command)
                .withAttachStdout(true)
                .withAttachStderr(true)
                .withUser(user)
                .exec();
    } catch (NotFoundException e) {
        throw new ContainerNotFoundException(containerName);
    }
}
 
示例11
@Test
public void testExecuteCompletes() {
    final String containerId = "container-id";
    final String[] command = new String[] {"/bin/ls", "-l"};
    final String execId = "exec-id";
    final int exitCode = 3;

    final ExecCreateCmdResponse response = mock(ExecCreateCmdResponse.class);
    when(response.getId()).thenReturn(execId);

    final ExecCreateCmd execCreateCmd = mock(ExecCreateCmd.class);
    when(dockerClient.execCreateCmd(any(String.class))).thenReturn(execCreateCmd);
    when(execCreateCmd.withCmd(ArgumentMatchers.<String>any())).thenReturn(execCreateCmd);
    when(execCreateCmd.withAttachStdout(any(Boolean.class))).thenReturn(execCreateCmd);
    when(execCreateCmd.withAttachStderr(any(Boolean.class))).thenReturn(execCreateCmd);
    when(execCreateCmd.withUser(any(String.class))).thenReturn(execCreateCmd);
    when(execCreateCmd.exec()).thenReturn(response);

    final ExecStartCmd execStartCmd = mock(ExecStartCmd.class);
    when(dockerClient.execStartCmd(any(String.class))).thenReturn(execStartCmd);
    when(execStartCmd.exec(any(ExecStartResultCallback.class))).thenReturn(mock(ExecStartResultCallback.class));

    final InspectExecCmd inspectExecCmd = mock(InspectExecCmd.class);
    final InspectExecResponse state = mock(InspectExecResponse.class);
    when(dockerClient.inspectExecCmd(any(String.class))).thenReturn(inspectExecCmd);
    when(inspectExecCmd.exec()).thenReturn(state);
    when(state.isRunning()).thenReturn(false);
    when(state.getExitCode()).thenReturn(exitCode);

    final ProcessResult result = docker.executeInContainerAsUser(
            new ContainerName(containerId), "root", OptionalLong.empty(), command);
    assertThat(result.getExitStatus(), is(exitCode));
}
 
示例12
/**
 * @param id The container id, will be used only the first one
 * @param serviceName Service name in running environment. Can be null.
 * @param script Script to execute
 */
@Override
public void execScript(List<String> id, String serviceName, String script) {
    log.info(String.format("Executing script: %s, in container: %s", script, id));

    String[] commands = null;
    try {
        /**
         * Due to permissions problems with mounted volume script is moved to some local directory in container
         *
         * 1. create new directory in container
         * 2. move there script
         * 3. chmod script
         * 4. execute script
         */
        commands = new String[] {
            "bash", "-c",
            scriptExecCommand(script)
        };

        ExecCreateCmdResponse exec = dockerClient.execCreateCmd(id.get(0))
                .withCmd(commands)
                .withAttachStdout(true)
                .withAttachStderr(true)
                .exec();

        dockerClient.execStartCmd(exec.getId())
                .exec(new ExecStartResultCallback(System.out, System.err))
                .awaitCompletion();
    } catch (DockerException | InterruptedException ex) {
        log.severe(String.format("Could not execute command: %s", Arrays.toString(commands)));
        throw new EnvironmentException("Could not execute command " + Arrays.toString(commands), ex);
    }
}
 
示例13
@SneakyThrows(InterruptedException.class)
private String startZookeeper() {
    ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(getContainerId())
        .withCmd("sh", "-c", "" +
            "printf 'clientPort=" + ZOOKEEPER_PORT + "\ndataDir=/var/lib/zookeeper/data\ndataLogDir=/var/lib/zookeeper/log' > /zookeeper.properties\n" +
            "zookeeper-server-start /zookeeper.properties\n"
        )
        .exec();

    dockerClient.execStartCmd(execCreateCmdResponse.getId()).start().awaitStarted(10, TimeUnit.SECONDS);

    return "localhost:" + ZOOKEEPER_PORT;
}
 
示例14
public String getContentOfFile(String path){
    ExecCreateCmdResponse execCreateCmdResponse;

    execCreateCmdResponse = dockerClient
        .execCreateCmd(executorId)
        .withAttachStdout(true)
        .withCmd("cat", path).exec();

    final ExecCreateCmdResponse finalExecCreateCmdResponse = execCreateCmdResponse;

    return ResponseCollector.collectResponse(dockerClient
        .execStartCmd(finalExecCreateCmdResponse.getId()).exec());
}
 
示例15
private void writeToFile(String op, String dest, String content) {
    ExecCreateCmdResponse execCreateCmdResponse;
    InputStream execCmdStream;

    execCreateCmdResponse = dockerClient
        .execCreateCmd(mesosLocalContainerID)
        .withAttachStdout(true)
        .withCmd("sh", "-c", "echo \"" + content + "\" " + op + " " + dest).exec();

    execCmdStream = dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec();
    System.out.println(ResponseCollector.collectResponse(execCmdStream));
}
 
示例16
@Test
public void execStart() throws Exception {
    assumeNotSwarm("no network in swarm", dockerRule);

    String containerName = "generated_" + new SecureRandom().nextInt();

    CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("top")
            .withName(containerName).exec();
    LOG.info("Created container {}", container.toString());
    assertThat(container.getId(), not(is(emptyString())));

    dockerRule.getClient().startContainerCmd(container.getId()).exec();

    ExecCreateCmdResponse execCreateCmdResponse = dockerRule.getClient().execCreateCmd(container.getId())
            .withAttachStdout(true)
            .withCmd("touch", "/execStartTest.log")
            .withUser("root")
            .exec();
    dockerRule.getClient().execStartCmd(execCreateCmdResponse.getId())
            .exec(new ExecStartResultCallback(System.out, System.err))
            .awaitCompletion();

    InputStream response = dockerRule.getClient().copyArchiveFromContainerCmd(container.getId(), "/execStartTest.log").exec();

    // read the stream fully. Otherwise, the underlying stream will not be closed.
    String responseAsString = asString(response);
    assertNotNull(responseAsString);
    assertTrue(responseAsString.length() > 0);
}
 
示例17
@Override
protected ExecCreateCmdResponse execute(ExecCreateCmd command) {
    WebTarget webResource = getBaseResource().path("/containers/{id}/exec").resolveTemplate("id",
            command.getContainerId());

    LOGGER.trace("POST: {}", webResource);

    return webResource.request().accept(MediaType.APPLICATION_JSON)
            .post(command, new TypeReference<ExecCreateCmdResponse>() {
            });
}
 
示例18
/**
 * Run a command inside a running container, as though using "docker exec".
 * <p>
 * This functionality is not available on a docker daemon running the older "lxc" execution driver. At
 * the time of writing, CircleCI was using this driver.
 * @param containerInfo the container info
 * @param outputCharset the character set used to interpret the output.
 * @param command the parts of the command to run
 * @return the result of execution
 * @throws IOException if there's an issue communicating with Docker
 * @throws InterruptedException if the thread waiting for the response is interrupted
 * @throws UnsupportedOperationException if the docker daemon you're connecting to doesn't support "exec".
 */
public Container.ExecResult execInContainer(InspectContainerResponse containerInfo, Charset outputCharset, String... command)
    throws UnsupportedOperationException, IOException, InterruptedException {
    if (!TestEnvironment.dockerExecutionDriverSupportsExec()) {
        // at time of writing, this is the expected result in CircleCI.
        throw new UnsupportedOperationException(
            "Your docker daemon is running the \"lxc\" driver, which doesn't support \"docker exec\".");

    }

    if (!isRunning(containerInfo)) {
        throw new IllegalStateException("execInContainer can only be used while the Container is running");
    }

    String containerId = containerInfo.getId();
    String containerName = containerInfo.getName();

    DockerClient dockerClient = DockerClientFactory.instance().client();

    log.debug("{}: Running \"exec\" command: {}", containerName, String.join(" ", command));
    final ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(containerId)
        .withAttachStdout(true).withAttachStderr(true).withCmd(command).exec();

    final ToStringConsumer stdoutConsumer = new ToStringConsumer();
    final ToStringConsumer stderrConsumer = new ToStringConsumer();

    try (FrameConsumerResultCallback callback = new FrameConsumerResultCallback()) {
        callback.addConsumer(OutputFrame.OutputType.STDOUT, stdoutConsumer);
        callback.addConsumer(OutputFrame.OutputType.STDERR, stderrConsumer);

        dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(callback).awaitCompletion();
    }
    Integer exitCode = dockerClient.inspectExecCmd(execCreateCmdResponse.getId()).exec().getExitCode();

    final Container.ExecResult result = new Container.ExecResult(
        exitCode,
        stdoutConsumer.toString(outputCharset),
        stderrConsumer.toString(outputCharset));

    log.trace("{}: stdout: {}", containerName, result.getStdout());
    log.trace("{}: stderr: {}", containerName, result.getStderr());
    return result;
}
 
示例19
@Test
public void execCreateTest() {
    String containerName = "generated_" + new SecureRandom().nextInt();

    CreateContainerResponse container = dockerRule.getClient().createContainerCmd(DEFAULT_IMAGE).withUser("root").withCmd("top")
            .withName(containerName).exec();

    LOG.info("Created container {}", container.toString());

    assertThat(container.getId(), not(is(emptyString())));

    dockerRule.getClient().startContainerCmd(container.getId()).exec();

    ExecCreateCmdResponse execCreateCmdResponse = dockerRule.getClient().execCreateCmd(container.getId())
            .withCmd("touch", "file.log").exec();

    assertThat(execCreateCmdResponse.getId(), not(is(emptyString())));
}
 
示例20
@Test
public void resizeExecInstanceTtyTest() throws Exception {
    String containerName = "generated_" + new SecureRandom().nextInt();

    CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withUser("root")
            .withCmd("sleep", "9999").withName(containerName).exec();

    dockerRule.getClient().startContainerCmd(container.getId()).exec();

    // wait until tty size changed to target size
    ExecCreateCmdResponse execCreateCmdResponse = dockerRule.getClient().execCreateCmd(container.getId()).withTty(true)
        .withAttachStdout(true).withAttachStderr(true)
        .withCmd("sh", "-c", String.format("until stty size | grep '%d %d'; do : ; done", TTY_HEIGHT, TTY_WIDTH)).exec();

    final ExecStartResultCallback execStartResultCallback = new ExecStartResultCallback(System.out, System.err);

    dockerRule.getClient().execStartCmd(execCreateCmdResponse.getId()).exec(execStartResultCallback).awaitStarted();

    dockerRule.getClient().resizeExecCmd(execCreateCmdResponse.getId()).withSize(TTY_HEIGHT, TTY_WIDTH).exec();

    // time out, exec instance resize failed
    boolean waitResult = execStartResultCallback.awaitCompletion(10, TimeUnit.SECONDS);

    assertThat(waitResult, equalTo(true));
}
 
示例21
@Test
public void inspectExec() throws Exception {
    String containerName = "generated_" + new SecureRandom().nextInt();

    CreateContainerResponse container = dockerRule.getClient().createContainerCmd("busybox").withCmd("sleep", "9999")
            .withName(containerName).exec();
    LOG.info("Created container {}", container.toString());
    assertThat(container.getId(), not(is(emptyString())));

    dockerRule.getClient().startContainerCmd(container.getId()).exec();

    // Check that file does not exist
    ExecCreateCmdResponse checkFileExec1 = dockerRule.getClient().execCreateCmd(container.getId()).withAttachStdout(true)
            .withAttachStderr(true).withCmd("test", "-e", "/marker").exec();
    LOG.info("Created exec {}", checkFileExec1.toString());
    assertThat(checkFileExec1.getId(), not(is(emptyString())));
    dockerRule.getClient().execStartCmd(checkFileExec1.getId()).withDetach(false)
            .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion();
    InspectExecResponse first = dockerRule.getClient().inspectExecCmd(checkFileExec1.getId()).exec();
    assertThat(first.isRunning(), is(false));
    assertThat(first.getExitCode(), is(1));

    // Create the file
    ExecCreateCmdResponse touchFileExec = dockerRule.getClient().execCreateCmd(container.getId()).withAttachStdout(true)
            .withAttachStderr(true).withCmd("touch", "/marker").exec();
    LOG.info("Created exec {}", touchFileExec.toString());
    assertThat(touchFileExec.getId(), not(is(emptyString())));
    dockerRule.getClient().execStartCmd(touchFileExec.getId()).withDetach(false)
            .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion();
    InspectExecResponse second = dockerRule.getClient().inspectExecCmd(touchFileExec.getId()).exec();
    assertThat(second.isRunning(), is(false));
    assertThat(second.getExitCode(), is(0));

    // Check that file does exist now
    ExecCreateCmdResponse checkFileExec2 = dockerRule.getClient().execCreateCmd(container.getId()).withAttachStdout(true)
            .withAttachStderr(true).withCmd("test", "-e", "/marker").exec();
    LOG.info("Created exec {}", checkFileExec2.toString());
    assertThat(checkFileExec2.getId(), not(is(emptyString())));
    dockerRule.getClient().execStartCmd(checkFileExec2.getId()).withDetach(false)
            .exec(new ExecStartResultCallback(System.out, System.err)).awaitCompletion();
    InspectExecResponse third = dockerRule.getClient().inspectExecCmd(checkFileExec2.getId()).exec();
    assertThat(third.isRunning(), is(false));
    assertThat(third.getExitCode(), is(0));

    // Get container info and check its roundtrip to ensure the consistency
    InspectContainerResponse containerInfo = dockerRule.getClient().inspectContainerCmd(container.getId()).exec();
    assertEquals(containerInfo.getId(), container.getId());
    JSONTestHelper.testRoundTrip(containerInfo);
}
 
示例22
/**
 * @throws NotFoundException
 *             No such container
 */
@Override
public ExecCreateCmdResponse exec() throws NotFoundException {
    return super.exec();
}
 
示例23
@Override
public void launch(final SlaveComputer computer, TaskListener listener) throws IOException, InterruptedException {
    final PrintStream logger = computer.getListener().getLogger();
    final String jenkinsUrl = Jenkins.getInstance().getRootUrl();
    final String effectiveJavaExe = StringUtils.isNotBlank(javaExeOrNull) ? javaExeOrNull : DEFAULT_JAVA_EXE;
    final String effectiveJvmArgs = StringUtils.isNotBlank(jvmArgsOrEmpty) ? jvmArgsOrEmpty : DEFAULT_JVM_ARGS ;
    final EnvVars knownVariables = calculateVariablesForVariableSubstitution(effectiveJavaExe, effectiveJvmArgs, remoting.getName(), remoteFs, jenkinsUrl);
    final String effectiveEntryPointCmdString = StringUtils.isNotBlank(entryPointCmdOrEmpty) ? entryPointCmdOrEmpty : DEFAULT_ENTRY_POINT_CMD_STRING;
    final String resolvedEntryPointCmdString = Util.replaceMacro(effectiveEntryPointCmdString, knownVariables);
    final String[] resolvedEntryPointCmd = splitAndFilterEmpty(resolvedEntryPointCmdString, "\n");
    logger.println("Connecting to docker container " + containerId + ", running command " + Joiner.on(" ").join(resolvedEntryPointCmd));

    final String execId;
    try(final DockerClient client = api.getClient()) {
        final ExecCreateCmd cmd = client.execCreateCmd(containerId)
                .withAttachStdin(true)
                .withAttachStdout(true)
                .withAttachStderr(true)
                .withTty(false)
                .withCmd(resolvedEntryPointCmd);
        if (StringUtils.isNotBlank(userOrNull)) {
            cmd.withUser(userOrNull);
        }
        final ExecCreateCmdResponse exec = cmd.exec();
        execId = exec.getId();
    }
    final String js = "{ \"Detach\": false, \"Tty\": false }";
    final Socket socket = api.getSocket();
    final OutputStream out = socket.getOutputStream();
    final InputStream in = socket.getInputStream();
    final PrintWriter w = new PrintWriter(new OutputStreamWriter(out, StandardCharsets.US_ASCII));
    w.println("POST /v1.32/exec/" + execId + "/start HTTP/1.1");
    w.println("Host: docker.sock");
    w.println("Content-Type: application/json");
    w.println("Upgrade: tcp");
    w.println("Connection: Upgrade");
    w.println("Content-Length: " + js.length());
    w.println();
    w.println(js);
    w.flush();

    // read HTTP response headers
    String line = readLine(in);
    logger.println(line);
    if (! line.startsWith("HTTP/1.1 101 ")) {   // Switching Protocols
        throw new IOException("Unexpected HTTP response status line " + line);
    }

    // Skip HTTP header
    while ((line = readLine(in)).length() > 0) {
        if (line.length() == 0) break; // end of header
        logger.println(line);
    }

    final InputStream demux = new DockerMultiplexedInputStream(in);

    computer.setChannel(demux, out, listener, new Channel.Listener() {
        @Override
        public void onClosed(Channel channel, IOException cause) {
            // Bye!
        }
    });

}
 
示例24
public void exec(String id, String... cmd){
    ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(id)
            .withAttachStdout(true)
            .withCmd(cmd).exec();
}