diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index 4052e87b9..53b212605 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -2,38 +2,7 @@ import java.io.*; -import com.github.dockerjava.api.command.AttachContainerCmd; -import com.github.dockerjava.api.command.AuthCmd; -import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.command.CommitCmd; -import com.github.dockerjava.api.command.ContainerDiffCmd; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; -import com.github.dockerjava.api.command.CreateContainerCmd; -import com.github.dockerjava.api.command.CreateImageCmd; -import com.github.dockerjava.api.command.EventCallback; -import com.github.dockerjava.api.command.EventsCmd; -import com.github.dockerjava.api.command.InfoCmd; -import com.github.dockerjava.api.command.InspectContainerCmd; -import com.github.dockerjava.api.command.InspectImageCmd; -import com.github.dockerjava.api.command.KillContainerCmd; -import com.github.dockerjava.api.command.ListContainersCmd; -import com.github.dockerjava.api.command.ListImagesCmd; -import com.github.dockerjava.api.command.LogContainerCmd; -import com.github.dockerjava.api.command.PauseContainerCmd; -import com.github.dockerjava.api.command.PingCmd; -import com.github.dockerjava.api.command.PullImageCmd; -import com.github.dockerjava.api.command.PushImageCmd; -import com.github.dockerjava.api.command.RemoveContainerCmd; -import com.github.dockerjava.api.command.RemoveImageCmd; -import com.github.dockerjava.api.command.RestartContainerCmd; -import com.github.dockerjava.api.command.SearchImagesCmd; -import com.github.dockerjava.api.command.StartContainerCmd; -import com.github.dockerjava.api.command.StopContainerCmd; -import com.github.dockerjava.api.command.TagImageCmd; -import com.github.dockerjava.api.command.TopContainerCmd; -import com.github.dockerjava.api.command.UnpauseContainerCmd; -import com.github.dockerjava.api.command.VersionCmd; -import com.github.dockerjava.api.command.WaitContainerCmd; +import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.model.AuthConfig; // https://godoc.org/github.com/fsouza/go-dockerclient @@ -95,6 +64,8 @@ public CreateImageCmd createImageCmd(String repository, */ public StartContainerCmd startContainerCmd(String containerId); + public ExecCreateCmd execCreateCmd(String containerId); + public InspectContainerCmd inspectContainerCmd(String containerId); public RemoveContainerCmd removeContainerCmd(String containerId); @@ -103,6 +74,8 @@ public CreateImageCmd createImageCmd(String repository, public AttachContainerCmd attachContainerCmd(String containerId); + public ExecStartCmd execStartCmd(String containerId); + public LogContainerCmd logContainerCmd(String containerId); public CopyFileFromContainerCmd copyFileFromContainerCmd( diff --git a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java index 24c0a4650..df26743e1 100644 --- a/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java +++ b/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java @@ -15,6 +15,8 @@ public interface DockerCmdExecFactory extends Closeable { public PingCmd.Exec createPingCmdExec(); + public ExecCreateCmd.Exec createExecCmdExec(); + public VersionCmd.Exec createVersionCmdExec(); public PullImageCmd.Exec createPullImageCmdExec(); @@ -45,6 +47,8 @@ public interface DockerCmdExecFactory extends Closeable { public AttachContainerCmd.Exec createAttachContainerCmdExec(); + public ExecStartCmd.Exec createExecStartCmdExec(); + public LogContainerCmd.Exec createLogContainerCmdExec(); public CopyFileFromContainerCmd.Exec createCopyFileFromContainerCmdExec(); diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java new file mode 100644 index 000000000..e71fb04e3 --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmd.java @@ -0,0 +1,19 @@ +package com.github.dockerjava.api.command; + +public interface ExecCreateCmd extends DockerCmd { + + public String getContainerId(); + + public ExecCreateCmd withCmd(String... cmd); + + public ExecCreateCmd attachStdin(boolean attachStdin); + + public ExecCreateCmd attachStdout(boolean attachStdout); + + public ExecCreateCmd attachStderr(boolean attachStderr); + + public ExecCreateCmd tty(boolean tty); + + public static interface Exec extends DockerCmdExec { + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java new file mode 100644 index 000000000..391625cfa --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ExecCreateCmdResponse.java @@ -0,0 +1,15 @@ +package com.github.dockerjava.api.command; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ExecCreateCmdResponse { + + @JsonProperty("Id") + private String id; + + public String getId() { + return id; + } +} diff --git a/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java new file mode 100644 index 000000000..8f6fff7bb --- /dev/null +++ b/src/main/java/com/github/dockerjava/api/command/ExecStartCmd.java @@ -0,0 +1,22 @@ +package com.github.dockerjava.api.command; + +import com.github.dockerjava.api.NotFoundException; + +import java.io.InputStream; + +public interface ExecStartCmd extends DockerCmd{ + + public String getContainerId(); + + public boolean isDetach(); + + public boolean isTty(); + + /** + * @throws com.github.dockerjava.api.NotFoundException No such container + */ + @Override + public InputStream exec() throws NotFoundException; + + public static interface Exec extends DockerCmdExec {} +} diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 1a2a58c0b..1a06c2d55 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -193,6 +193,11 @@ public InspectContainerCmd inspectContainerCmd(String containerId) { return new InspectContainerCmdImpl(getDockerCmdExecFactory().createInspectContainerCmdExec(), containerId); } + @Override + public ExecCreateCmd execCreateCmd(String containerId) { + return new ExecCreateCmdImpl(getDockerCmdExecFactory().createExecCmdExec(), containerId); + } + @Override public RemoveContainerCmd removeContainerCmd(String containerId) { return new RemoveContainerCmdImpl(getDockerCmdExecFactory().createRemoveContainerCmdExec(), containerId); @@ -208,6 +213,11 @@ public AttachContainerCmd attachContainerCmd(String containerId) { return new AttachContainerCmdImpl(getDockerCmdExecFactory().createAttachContainerCmdExec(), containerId); } + @Override + public ExecStartCmd execStartCmd(String containerId) { + return new ExecStartCmdImpl(getDockerCmdExecFactory().createExecStartCmdExec(), containerId); + } + @Override public LogContainerCmd logContainerCmd(String containerId) { return new LogContainerCmdImpl(getDockerCmdExecFactory().createLogContainerCmdExec(), containerId); diff --git a/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java new file mode 100644 index 000000000..22ff63945 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ExecCreateCmdImpl.java @@ -0,0 +1,69 @@ +package com.github.dockerjava.core.command; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; + +public class ExecCreateCmdImpl extends AbstrDockerCmd implements ExecCreateCmd { + + private String containerId; + + @JsonProperty("AttachStdin") + private boolean attachStdin; + + @JsonProperty("AttachStdout") + private boolean attachStdout; + + @JsonProperty("AttachStderr") + private boolean attachStderr; + + @JsonProperty("Tty") + private boolean tty; + + @JsonProperty("Cmd") + private String[] cmd; + + public ExecCreateCmdImpl(ExecCreateCmd.Exec exec, String containerId) { + super(exec); + this.containerId = containerId; + } + + public ExecCreateCmd attachStdin(boolean attachStdin) { + this.attachStdin = attachStdin; + return this; + } + + public ExecCreateCmd attachStdout(boolean attachStdout) { + this.attachStdout = attachStdout; + return this; + } + + public ExecCreateCmd tty(boolean tty) { + this.tty = tty; + return this; + } + + public ExecCreateCmd attachStderr(boolean attachStderr) { + this.attachStderr = attachStderr; + return this; + } + + public ExecCreateCmd withCmd(String... cmd) { + this.cmd = cmd; + return this; + } + + @Override + public String getContainerId() { + return containerId; + } + + /** + * @throws NotFoundException No such container + */ + @Override + public ExecCreateCmdResponse exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java new file mode 100644 index 000000000..b3c37dc51 --- /dev/null +++ b/src/main/java/com/github/dockerjava/core/command/ExecStartCmdImpl.java @@ -0,0 +1,43 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.NotFoundException; +import com.github.dockerjava.api.command.ExecStartCmd; +import com.google.common.base.Preconditions; + +import java.io.InputStream; + +public class ExecStartCmdImpl extends AbstrDockerCmd implements ExecStartCmd { + + private String containerId; + + private boolean detach, tty; + + public ExecStartCmdImpl(ExecStartCmd.Exec exec, String containerId) { + super(exec); + Preconditions.checkNotNull(containerId, "containerId was not specified"); + this.containerId = containerId; + } + + @Override + public String getContainerId() { + return containerId; + } + + @Override + public boolean isDetach() { + return detach; + } + + @Override + public boolean isTty() { + return tty; + } + + /** + * @throws com.github.dockerjava.api.NotFoundException No such container + */ + @Override + public InputStream exec() throws NotFoundException { + return super.exec(); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java index 64222a972..525e4a586 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java +++ b/src/main/java/com/github/dockerjava/jaxrs/DockerCmdExecFactoryImpl.java @@ -3,15 +3,12 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; import com.github.dockerjava.api.DockerClientException; import com.github.dockerjava.api.command.*; -import com.github.dockerjava.core.CertificateUtils; import com.github.dockerjava.core.DockerClientConfig; import com.github.dockerjava.jaxrs.util.JsonClientFilter; import com.github.dockerjava.jaxrs.util.ResponseStatusExceptionFilter; import com.github.dockerjava.jaxrs.util.SelectiveLoggingFilter; import com.google.common.base.Preconditions; -import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.glassfish.jersey.CommonProperties; -import org.glassfish.jersey.SslConfigurator; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.client.ClientProperties; @@ -20,8 +17,6 @@ import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; import java.io.IOException; -import java.security.KeyStore; -import java.security.Security; import java.util.logging.Logger; public class DockerCmdExecFactoryImpl implements DockerCmdExecFactory { @@ -154,6 +149,11 @@ public InspectContainerCmd.Exec createInspectContainerCmdExec() { return new InspectContainerCmdExec(getBaseResource()); } + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return new ExecCreateCmdExec(getBaseResource()); + } + @Override public RemoveContainerCmd.Exec createRemoveContainerCmdExec() { return new RemoveContainerCmdExec(getBaseResource()); @@ -169,6 +169,11 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return new AttachContainerCmdExec(getBaseResource()); } + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return new ExecStartCmdExec(getBaseResource()); + } + @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return new LogContainerCmdExec(getBaseResource()); diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java new file mode 100644 index 000000000..69346efd5 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecCreateCmdExec.java @@ -0,0 +1,30 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ExecCreateCmd; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; + +import static javax.ws.rs.client.Entity.entity; + +public class ExecCreateCmdExec extends AbstrDockerCmdExec implements ExecCreateCmd.Exec { + + private static final Logger LOGGER = LoggerFactory + .getLogger(VersionCmdExec.class); + + public ExecCreateCmdExec(WebTarget baseResource) { + super(baseResource); + } + + @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(entity(command, MediaType.APPLICATION_JSON), ExecCreateCmdResponse.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java new file mode 100644 index 000000000..d5f7c4781 --- /dev/null +++ b/src/main/java/com/github/dockerjava/jaxrs/ExecStartCmdExec.java @@ -0,0 +1,31 @@ +package com.github.dockerjava.jaxrs; + +import com.github.dockerjava.api.command.ExecStartCmd; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.InputStream; + +import static javax.ws.rs.client.Entity.entity; + +public class ExecStartCmdExec extends AbstrDockerCmdExec implements ExecStartCmd.Exec { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExecStartCmdExec.class); + + public ExecStartCmdExec(WebTarget baseResource) { + super(baseResource); + } + + + @Override + protected InputStream execute(ExecStartCmd command) { + WebTarget webResource = getBaseResource().path("/exec/{id}/start").resolveTemplate("id", command.getContainerId()); + + LOGGER.trace("POST: {}", webResource); + + return webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON), Response.class).readEntity(InputStream.class); + } +} diff --git a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java index 8a2c09a44..0e7697e4e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/StartContainerCmdExec.java @@ -20,8 +20,7 @@ public StartContainerCmdExec(WebTarget baseResource) { @Override protected Void execute(StartContainerCmd command) { - WebTarget webResource = getBaseResource().path("/containers/{id}/start") - .resolveTemplate("id", command.getContainerId()); + WebTarget webResource = getBaseResource().path("/containers/{id}/start").resolveTemplate("id", command.getContainerId()); LOGGER.trace("POST: {}", webResource); webResource.request().accept(MediaType.APPLICATION_JSON).post(entity(command, MediaType.APPLICATION_JSON)); diff --git a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java index 3a5857c9b..c63667a0d 100644 --- a/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java +++ b/src/test/java/com/github/dockerjava/core/TestDockerCmdExecFactory.java @@ -6,41 +6,8 @@ import java.util.ArrayList; import java.util.List; -import com.github.dockerjava.api.command.AttachContainerCmd; +import com.github.dockerjava.api.command.*; import com.github.dockerjava.api.command.AuthCmd.Exec; -import com.github.dockerjava.api.command.BuildImageCmd; -import com.github.dockerjava.api.command.CommitCmd; -import com.github.dockerjava.api.command.ContainerDiffCmd; -import com.github.dockerjava.api.command.CopyFileFromContainerCmd; -import com.github.dockerjava.api.command.CreateContainerCmd; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.CreateImageCmd; -import com.github.dockerjava.api.command.CreateImageResponse; -import com.github.dockerjava.api.command.DockerCmdExecFactory; -import com.github.dockerjava.api.command.EventsCmd; -import com.github.dockerjava.api.command.InfoCmd; -import com.github.dockerjava.api.command.InspectContainerCmd; -import com.github.dockerjava.api.command.InspectImageCmd; -import com.github.dockerjava.api.command.KillContainerCmd; -import com.github.dockerjava.api.command.ListContainersCmd; -import com.github.dockerjava.api.command.ListImagesCmd; -import com.github.dockerjava.api.command.LogContainerCmd; -import com.github.dockerjava.api.command.PauseContainerCmd; -import com.github.dockerjava.api.command.PingCmd; -import com.github.dockerjava.api.command.PullImageCmd; -import com.github.dockerjava.api.command.PushImageCmd; -import com.github.dockerjava.api.command.RemoveContainerCmd; -import com.github.dockerjava.api.command.RemoveImageCmd; -import com.github.dockerjava.api.command.RestartContainerCmd; -import com.github.dockerjava.api.command.SearchImagesCmd; -import com.github.dockerjava.api.command.StartContainerCmd; -import com.github.dockerjava.api.command.StopContainerCmd; -import com.github.dockerjava.api.command.TagImageCmd; -import com.github.dockerjava.api.command.TopContainerCmd; -import com.github.dockerjava.api.command.UnpauseContainerCmd; -import com.github.dockerjava.api.command.VersionCmd; -import com.github.dockerjava.api.command.WaitContainerCmd; -import com.github.dockerjava.core.DockerClientConfig; /** * Special {@link DockerCmdExecFactory} implementation that collects container and image creations @@ -154,7 +121,12 @@ public PingCmd.Exec createPingCmdExec() { return delegate.createPingCmdExec(); } - @Override + @Override + public ExecCreateCmd.Exec createExecCmdExec() { + return delegate.createExecCmdExec(); + } + + @Override public VersionCmd.Exec createVersionCmdExec() { return delegate.createVersionCmdExec(); } @@ -209,7 +181,12 @@ public AttachContainerCmd.Exec createAttachContainerCmdExec() { return delegate.createAttachContainerCmdExec(); } - @Override + @Override + public ExecStartCmd.Exec createExecStartCmdExec() { + return delegate.createExecStartCmdExec(); + } + + @Override public LogContainerCmd.Exec createLogContainerCmdExec() { return delegate.createLogContainerCmdExec(); } diff --git a/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java new file mode 100644 index 000000000..338763e6c --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ExecCreateCmdImplTest.java @@ -0,0 +1,57 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.*; + +import java.lang.reflect.Method; +import java.security.SecureRandom; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +@Test(groups = "integration") +public class ExecCreateCmdImplTest extends AbstractDockerClientTest { + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void execCreateTest() { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("top") + .withName(containerName).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).withCmd("touch","file.log").exec(); + + assertThat(execCreateCmdResponse.getId(), not(isEmptyString())); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java new file mode 100644 index 000000000..044d13458 --- /dev/null +++ b/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java @@ -0,0 +1,60 @@ +package com.github.dockerjava.core.command; + +import com.github.dockerjava.api.DockerException; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.ExecCreateCmdResponse; +import com.github.dockerjava.client.AbstractDockerClientTest; +import org.testng.ITestResult; +import org.testng.annotations.*; + +import java.io.InputStream; +import java.lang.reflect.Method; +import java.security.SecureRandom; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.Matchers.not; + +@Test(groups = "integration") +public class ExecStartCmdImplTest extends AbstractDockerClientTest { + @BeforeTest + public void beforeTest() throws DockerException { + super.beforeTest(); + } + + @AfterTest + public void afterTest() { + super.afterTest(); + } + + @BeforeMethod + public void beforeMethod(Method method) { + super.beforeMethod(method); + } + + @AfterMethod + public void afterMethod(ITestResult result) { + super.afterMethod(result); + } + + @Test + public void execStartTest() throws Exception { + String containerName = "generated_" + new SecureRandom().nextInt(); + + CreateContainerResponse container = dockerClient + .createContainerCmd("busybox").withCmd("top") + .withName(containerName).exec(); + + LOG.info("Created container {}", container.toString()); + + assertThat(container.getId(), not(isEmptyString())); + + dockerClient.startContainerCmd(container.getId()).exec(); + + ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(container.getId()).attachStdout(true).withCmd("touch","file.log").exec(); + dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(); + + InputStream response = dockerClient.copyFileFromContainerCmd(container.getId(), "/file.log").exec(); + assertTrue(response.available() > 0, "The file was not copied from the container."); + } +} diff --git a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java index de744b59a..10b656e66 100644 --- a/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/StartContainerCmdImplTest.java @@ -200,7 +200,7 @@ public void startContainerWithPortBindings() throws DockerException { dockerClient.startContainerCmd(container.getId()).withPortBindings(portBindings).exec(); inspectContainerResponse = dockerClient.inspectContainerCmd(container - .getId()).exec(); + .getId()).exec(); assertThat(Arrays.asList(inspectContainerResponse.getConfig().getExposedPorts()), contains(tcp22, tcp23));