diff --git a/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml b/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml
index 3a59db8cda7..650839777ac 100644
--- a/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml
+++ b/spring-boot-integration-tests/spring-boot-launch-script-tests/pom.xml
@@ -36,7 +36,7 @@
com.github.docker-java
docker-java
- 3.0.0-RC1
+ 2.2.2
test
diff --git a/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java b/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java
index eeea6246e7c..89df5ce4c4a 100644
--- a/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java
+++ b/spring-boot-integration-tests/spring-boot-launch-script-tests/src/test/java/org/springframework/boot/launchscript/SysVinitLaunchScriptIT.java
@@ -17,20 +17,30 @@
package org.springframework.boot.launchscript;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+
import com.github.dockerjava.api.DockerClient;
-import com.github.dockerjava.api.exception.DockerClientException;
+import com.github.dockerjava.api.command.DockerCmd;
import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.core.CompressArchiveUtil;
import com.github.dockerjava.core.DockerClientBuilder;
import com.github.dockerjava.core.DockerClientConfig;
-import com.github.dockerjava.core.DockerClientConfig.DockerClientConfigBuilder;
import com.github.dockerjava.core.command.AttachContainerResultCallback;
import com.github.dockerjava.core.command.BuildImageResultCallback;
-import com.github.dockerjava.core.command.WaitContainerResultCallback;
+import com.github.dockerjava.jaxrs.AbstrSyncDockerCmdExec;
+import com.github.dockerjava.jaxrs.DockerCmdExecFactoryImpl;
import org.assertj.core.api.Condition;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -53,6 +63,8 @@ import static org.junit.Assume.assumeThat;
@RunWith(Parameterized.class)
public class SysVinitLaunchScriptIT {
+ private final SpringBootDockerCmdExecFactory commandExecFactory = new SpringBootDockerCmdExecFactory();
+
private static final char ESC = 27;
private final String os;
@@ -211,8 +223,7 @@ public class SysVinitLaunchScriptIT {
});
resultCallback.awaitCompletion(60, TimeUnit.SECONDS).close();
- docker.waitContainerCmd(container).exec(new WaitContainerResultCallback())
- .awaitCompletion(60, TimeUnit.SECONDS);
+ docker.waitContainerCmd(container).exec();
return output.toString();
}
finally {
@@ -221,16 +232,11 @@ public class SysVinitLaunchScriptIT {
}
private DockerClient createClient() {
- DockerClientConfigBuilder builder = DockerClientConfig
- .createDefaultConfigBuilder();
- DockerClientConfig config;
- try {
- config = builder.build();
- }
- catch (DockerClientException ex) {
- config = builder.withDockerTlsVerify(false).build();
- }
- return DockerClientBuilder.getInstance(config).build();
+ DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder()
+ .build();
+ DockerClient docker = DockerClientBuilder.getInstance(config)
+ .withDockerCmdExecFactory(this.commandExecFactory).build();
+ return docker;
}
private String buildImage(DockerClient docker) {
@@ -258,9 +264,10 @@ public class SysVinitLaunchScriptIT {
new File("src/test/resources/scripts/" + script));
}
- private void copyToContainer(DockerClient docker, String container, File file) {
- docker.copyArchiveToContainerCmd(container)
- .withHostResource(file.getAbsolutePath()).exec();
+ private void copyToContainer(DockerClient docker, final String container,
+ final File file) {
+ this.commandExecFactory.createCopyToContainerCmdExec()
+ .exec(new CopyToContainerCmd(container, file));
}
private File findApplication() {
@@ -302,4 +309,81 @@ public class SysVinitLaunchScriptIT {
"Failed to extract " + label + " from output: " + output);
}
+ private static final class CopyToContainerCmdExec
+ extends AbstrSyncDockerCmdExec {
+
+ private CopyToContainerCmdExec(WebTarget baseResource,
+ DockerClientConfig dockerClientConfig) {
+ super(baseResource, dockerClientConfig);
+ }
+
+ @Override
+ protected Void execute(CopyToContainerCmd command) {
+ try {
+ InputStream streamToUpload = new FileInputStream(CompressArchiveUtil
+ .archiveTARFiles(command.getFile().getParentFile(),
+ Arrays.asList(command.getFile()),
+ command.getFile().getName()));
+ WebTarget webResource = getBaseResource().path("/containers/{id}/archive")
+ .resolveTemplate("id", command.getContainer());
+ webResource.queryParam("path", ".")
+ .queryParam("noOverwriteDirNonDir", false).request()
+ .put(Entity.entity(streamToUpload, "application/x-tar")).close();
+ return null;
+ }
+ catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ }
+
+ private static final class CopyToContainerCmd implements DockerCmd {
+
+ private final String container;
+
+ private final File file;
+
+ private CopyToContainerCmd(String container, File file) {
+ this.container = container;
+ this.file = file;
+ }
+
+ public String getContainer() {
+ return this.container;
+ }
+
+ public File getFile() {
+ return this.file;
+ }
+
+ @Override
+ public void close() {
+
+ }
+
+ }
+
+ private static final class SpringBootDockerCmdExecFactory
+ extends DockerCmdExecFactoryImpl {
+
+ private SpringBootDockerCmdExecFactory() {
+ withClientRequestFilters(new ClientRequestFilter() {
+
+ @Override
+ public void filter(ClientRequestContext requestContext)
+ throws IOException {
+ // Workaround for https://go-review.googlesource.com/#/c/3821/
+ requestContext.getHeaders().add("Connection", "close");
+ }
+
+ });
+ }
+
+ private CopyToContainerCmdExec createCopyToContainerCmdExec() {
+ return new CopyToContainerCmdExec(getBaseResource(), getDockerClientConfig());
+ }
+
+ }
+
}