Adopt locally build docker client

- supports connection pool config

See: https://github.com/docker-java/docker-java/pull/1474
This commit is contained in:
Kris De Volder
2020-10-26 12:50:30 -07:00
parent 833950648b
commit 84ca8b4571
19 changed files with 136 additions and 32 deletions

View File

@@ -1,3 +1,4 @@
{ {
"python.linting.pylintEnabled": false "python.linting.pylintEnabled": false,
"python.pythonPath": "/usr/bin/python"
} }

View File

@@ -1 +1,3 @@
mvn clean package -Pe417 -Psnapshot export JAVA_HOME=/home/kdvolder/Applications/jdk-11.0.8+10
mvn clean package -Pe417 -Psnapshot -Dsigning.skip=true -Dhttpclient.retry-max=20 -Dmaven.test.skip=true -Declipse.p2.mirrors=false -Dtycho.localArtifacts=ignore -Dorg.eclipse.equinox.p2.transport.ecf.retry=5 -Dskip.osx.signing=true -Dskip.win.signing=true -Dskip.osx.notarizing=true

View File

@@ -50,6 +50,7 @@ import org.springframework.ide.eclipse.boot.dash.api.Styleable;
import org.springframework.ide.eclipse.boot.dash.console.LogType; import org.springframework.ide.eclipse.boot.dash.console.LogType;
import org.springframework.ide.eclipse.boot.dash.devtools.DevtoolsUtil; import org.springframework.ide.eclipse.boot.dash.devtools.DevtoolsUtil;
import org.springframework.ide.eclipse.boot.dash.docker.jmx.JmxSupport; import org.springframework.ide.eclipse.boot.dash.docker.jmx.JmxSupport;
import org.springframework.ide.eclipse.boot.dash.docker.util.Ownable;
import org.springframework.ide.eclipse.boot.dash.model.RunState; import org.springframework.ide.eclipse.boot.dash.model.RunState;
import org.springframework.ide.eclipse.boot.dash.model.remote.RefreshStateTracker; import org.springframework.ide.eclipse.boot.dash.model.remote.RefreshStateTracker;
import org.springframework.ide.eclipse.boot.util.RetryUtil; import org.springframework.ide.eclipse.boot.util.RetryUtil;
@@ -359,6 +360,8 @@ public class DockerContainer implements App, RunStateProvider, JmxConnectable, S
.thenValAt("dependencies") .thenValAt("dependencies")
.thenAnyChild() .thenAnyChild()
.thenValAt("name"); .thenValAt("name");
private static final boolean USE_DEDICATED_CLIENT = false;
private Supplier<Boolean> hasDevtoolsDep; private Supplier<Boolean> hasDevtoolsDep;
@@ -454,10 +457,10 @@ public class DockerContainer implements App, RunStateProvider, JmxConnectable, S
private final CompletableFuture<Closeable> closeable = new CompletableFuture<Closeable>(); private final CompletableFuture<Closeable> closeable = new CompletableFuture<Closeable>();
private DockerClient dedicatedClient; private Ownable<DockerClient> client;
public LogHandler(DockerClient dedicatedClient, AppConsole console) { public LogHandler(Ownable<DockerClient> client, AppConsole console) {
this.dedicatedClient = dedicatedClient; this.client = client;
consoleOut = console.getOutputStream(LogType.APP_OUT); consoleOut = console.getOutputStream(LogType.APP_OUT);
consoleErr = console.getOutputStream(LogType.APP_OUT); consoleErr = console.getOutputStream(LogType.APP_OUT);
Log.info("Creating log handler. Now active: "+activeLogHandlers.incrementAndGet()); Log.info("Creating log handler. Now active: "+activeLogHandlers.incrementAndGet());
@@ -482,11 +485,12 @@ public class DockerContainer implements App, RunStateProvider, JmxConnectable, S
} catch (IOException e) { } catch (IOException e) {
} }
try { try {
Log.info("Closing log handler. Now active: "+activeLogHandlers.decrementAndGet()); if (client.isOwned) {
dedicatedClient.close(); client.ref.close();
}
} catch (IOException e) { } catch (IOException e) {
//ignore
} }
Log.info("Closing log handler. Now active: "+activeLogHandlers.decrementAndGet());
} }
} }
@@ -530,14 +534,16 @@ public class DockerContainer implements App, RunStateProvider, JmxConnectable, S
} }
public static LogConnection connectLog(DockerRunTarget target, String containerId, AppConsole console, boolean includeHistory) { public static LogConnection connectLog(DockerRunTarget target, String containerId, AppConsole console, boolean includeHistory) {
DockerClient client = target.getDedicatedClientInstance(); //Use a dedicated client for log streaming because java docker client will eventually run out of connections in connection pool
//Uses a dedicated client for log streaming because java docker client will eventually run out of connections in connection pool
//otherwise. //otherwise.
//See: //See:
// - https://www.pivotaltracker.com/n/projects/1346850 // - https://www.pivotaltracker.com/n/projects/1346850
// - https://github.com/docker-java/docker-java/issues/1466 // - https://github.com/docker-java/docker-java/issues/1466
Ownable<DockerClient> client = USE_DEDICATED_CLIENT
? Ownable.owned(target.getDedicatedClientInstance())
: Ownable.borrowed(target.getClient());
if (client!=null) { if (client!=null) {
LogContainerCmd cmd = client.logContainerCmd(containerId) LogContainerCmd cmd = client.ref.logContainerCmd(containerId)
.withStdOut(true).withStdErr(true).withFollowStream(true); .withStdOut(true).withStdErr(true).withFollowStream(true);
if (!includeHistory) { if (!includeHistory) {

View File

@@ -34,6 +34,7 @@ import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl; import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.transport.DockerHttpClient; import com.github.dockerjava.transport.DockerHttpClient;
import com.github.dockerjava.zerodep.ConnectionPoolConfig;
import com.github.dockerjava.zerodep.ZerodepDockerHttpClient; import com.github.dockerjava.zerodep.ZerodepDockerHttpClient;
public class DockerRunTargetType extends AbstractRemoteRunTargetType<DockerTargetParams> { public class DockerRunTargetType extends AbstractRemoteRunTargetType<DockerTargetParams> {
@@ -84,6 +85,9 @@ public class DockerRunTargetType extends AbstractRemoteRunTargetType<DockerTarge
DockerHttpClient httpClient = new ZerodepDockerHttpClient.Builder() DockerHttpClient httpClient = new ZerodepDockerHttpClient.Builder()
.dockerHost(conf.getDockerHost()) .dockerHost(conf.getDockerHost())
.sslConfig(conf.getSSLConfig()) .sslConfig(conf.getSSLConfig())
.connectionPool(new ConnectionPoolConfig()
.setMaxConnections(200)
)
.build(); .build();
return DockerClientImpl.getInstance(conf, httpClient); return DockerClientImpl.getInstance(conf, httpClient);
} }

View File

@@ -0,0 +1,24 @@
package org.springframework.ide.eclipse.boot.dash.docker.util;
/**
* Represents a references that is either 'borrowed' or 'owned'.
*/
public class Ownable<T> {
public final T ref;
public final boolean isOwned;
private Ownable(T ref, boolean owned) {
this.ref = ref;
this.isOwned = owned;
}
public static <T> Ownable<T> owned(T x) {
return x == null ? null : new Ownable<T>(x, true);
}
public static <T> Ownable<T> borrowed(T x) {
return x == null ? null : new Ownable<T>(x, false);
}
}

View File

@@ -1,22 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <classpath>
<classpathentry exported="true" kind="lib" path="dependency/docker-java-api-99.99.99-SNAPSHOT.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/docker-java-core-99.99.99-SNAPSHOT.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/docker-java-transport-99.99.99-SNAPSHOT.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/docker-java-transport-zerodep-99.99.99-SNAPSHOT.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry exported="true" kind="lib" path="dependency/bcpkix-jdk15on-1.64.jar"/> <classpathentry exported="true" kind="lib" path="dependency/bcpkix-jdk15on-1.64.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/bcprov-jdk15on-1.64.jar"/> <classpathentry exported="true" kind="lib" path="dependency/bcprov-jdk15on-1.64.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/commons-compress-1.20.jar"/> <classpathentry exported="true" kind="lib" path="dependency/commons-compress-1.20.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/commons-io-2.6.jar"/> <classpathentry exported="true" kind="lib" path="dependency/commons-io-2.6.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/commons-lang-2.6.jar"/> <classpathentry exported="true" kind="lib" path="dependency/commons-lang-2.6.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/docker-java-api-3.2.5.jar" sourcepath="/home/kdvolder/.m2/repository/com/github/docker-java/docker-java-api/3.2.5/docker-java-api-3.2.5-sources.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/docker-java-core-3.2.5.jar" sourcepath="/home/kdvolder/.m2/repository/com/github/docker-java/docker-java-core/3.2.5/docker-java-core-3.2.5-sources.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/docker-java-transport-3.2.5.jar" sourcepath="/home/kdvolder/.m2/repository/com/github/docker-java/docker-java-transport/3.2.5/docker-java-transport-3.2.5-sources.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/docker-java-transport-zerodep-3.2.5.jar" sourcepath="/home/kdvolder/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.5/docker-java-transport-zerodep-3.2.5-sources.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/guava-19.0.jar"/> <classpathentry exported="true" kind="lib" path="dependency/guava-19.0.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/jackson-annotations-2.11.2.jar"/> <classpathentry exported="true" kind="lib" path="dependency/jackson-annotations-2.11.2.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/jackson-core-2.11.2.jar"/> <classpathentry exported="true" kind="lib" path="dependency/jackson-core-2.11.2.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/jackson-databind-2.11.2.jar"/> <classpathentry exported="true" kind="lib" path="dependency/jackson-databind-2.11.2.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/jna-5.5.0.jar"/> <classpathentry exported="true" kind="lib" path="dependency/jna-5.5.0.jar"/>
<classpathentry exported="true" kind="lib" path="dependency/slf4j-api-1.7.30.jar"/> <classpathentry exported="true" kind="lib" path="dependency/slf4j-api-1.7.30.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry exported="true" kind="lib" path="dependency/slf4j-simple-1.7.30.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@@ -11,16 +11,16 @@ Bundle-ClassPath: .,
dependency/commons-compress-1.20.jar, dependency/commons-compress-1.20.jar,
dependency/commons-io-2.6.jar, dependency/commons-io-2.6.jar,
dependency/commons-lang-2.6.jar, dependency/commons-lang-2.6.jar,
dependency/docker-java-api-3.2.5.jar,
dependency/docker-java-core-3.2.5.jar,
dependency/docker-java-transport-3.2.5.jar,
dependency/docker-java-transport-zerodep-3.2.5.jar,
dependency/guava-19.0.jar,
dependency/jackson-annotations-2.11.2.jar, dependency/jackson-annotations-2.11.2.jar,
dependency/jackson-core-2.11.2.jar, dependency/jackson-core-2.11.2.jar,
dependency/jackson-databind-2.11.2.jar, dependency/jackson-databind-2.11.2.jar,
dependency/jna-5.5.0.jar, dependency/jna-5.5.0.jar,
dependency/slf4j-api-1.7.30.jar dependency/slf4j-api-1.7.30.jar,
dependency/slf4j-simple-1.7.30.jar,
dependency/docker-java-api-99.99.99-SNAPSHOT.jar,
dependency/docker-java-core-99.99.99-SNAPSHOT.jar,
dependency/docker-java-transport-99.99.99-SNAPSHOT.jar,
dependency/docker-java-transport-zerodep-99.99.99-SNAPSHOT.jar
Export-Package: com.github.dockerjava.api, Export-Package: com.github.dockerjava.api,
com.github.dockerjava.api.async, com.github.dockerjava.api.async,
com.github.dockerjava.api.command, com.github.dockerjava.api.command,
@@ -97,3 +97,4 @@ Export-Package: com.github.dockerjava.api,
com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.reactor.ssl, com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.reactor.ssl,
com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.ssl, com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.ssl,
com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.util com.github.dockerjava.zerodep.shaded.org.apache.hc.core5.util
Require-Bundle: com.google.guava

View File

@@ -8,13 +8,13 @@ bin.includes = META-INF/,\
dependency/commons-compress-1.20.jar,\ dependency/commons-compress-1.20.jar,\
dependency/commons-io-2.6.jar,\ dependency/commons-io-2.6.jar,\
dependency/commons-lang-2.6.jar,\ dependency/commons-lang-2.6.jar,\
dependency/docker-java-api-3.2.5.jar,\
dependency/docker-java-core-3.2.5.jar,\
dependency/docker-java-transport-3.2.5.jar,\
dependency/docker-java-transport-zerodep-3.2.5.jar,\
dependency/guava-19.0.jar,\ dependency/guava-19.0.jar,\
dependency/jackson-annotations-2.11.2.jar,\ dependency/jackson-annotations-2.11.2.jar,\
dependency/jackson-core-2.11.2.jar,\ dependency/jackson-core-2.11.2.jar,\
dependency/jackson-databind-2.11.2.jar,\ dependency/jackson-databind-2.11.2.jar,\
dependency/jna-5.5.0.jar,\ dependency/jna-5.5.0.jar,\
dependency/slf4j-api-1.7.30.jar dependency/slf4j-api-1.7.30.jar,\
dependency/docker-java-api-99.99.99-SNAPSHOT.jar,\
dependency/docker-java-core-99.99.99-SNAPSHOT.jar,\
dependency/docker-java-transport-99.99.99-SNAPSHOT.jar,\
dependency/docker-java-transport-zerodep-99.99.99-SNAPSHOT.jar

View File

@@ -22,12 +22,17 @@
<dependency> <dependency>
<groupId>com.github.docker-java</groupId> <groupId>com.github.docker-java</groupId>
<artifactId>docker-java-core</artifactId> <artifactId>docker-java-core</artifactId>
<version>3.2.5</version> <version>3.2.6-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.docker-java</groupId> <groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-zerodep</artifactId> <artifactId>docker-java-transport-zerodep</artifactId>
<version>3.2.5</version> <version>3.2.6-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@@ -7,6 +7,7 @@ import com.github.dockerjava.api.model.Image;
import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl; import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.transport.DockerHttpClient; import com.github.dockerjava.transport.DockerHttpClient;
import com.github.dockerjava.zerodep.ConnectionPoolConfig;
import com.github.dockerjava.zerodep.ZerodepDockerHttpClient; import com.github.dockerjava.zerodep.ZerodepDockerHttpClient;
public class DockerClientWrapperApplication { public class DockerClientWrapperApplication {
@@ -26,6 +27,13 @@ public class DockerClientWrapperApplication {
for (Image image : imgs) { for (Image image : imgs) {
System.out.println(image.getId()); System.out.println(image.getId());
} }
if (httpClient instanceof ConnectionPoolConfig) {
ConnectionPoolConfig cp = (ConnectionPoolConfig) httpClient;
System.out.println("max = " +cp.getPoolSizeMax());
System.out.println("max per route = "+cp.getPoolSizeDefaultMaxPerRoute());
}
} }
} }

View File

@@ -1,4 +1,4 @@
Alternate Docker Client com.github.dockerjavaAlternate Docker Client
===================== =====================
Repackaged as a single osgi bundle with all its dependencies. Repackaged as a single osgi bundle with all its dependencies.
@@ -13,7 +13,7 @@ Packaging Process:
- Build the maven project `docker-client-wrapper` which is included as a sub-folder in this project. - Build the maven project `docker-client-wrapper` which is included as a sub-folder in this project.
- copy all the jars from `docker-client-wrapper/target/dependency` to `dependency`. - copy all the jars from `docker-client-wrapper/target/dependency` to `dependency`.
- Open `manifest.mf` with PDE tabbed editor. Select the 'Runtime' tab and then: - Open `manifest.mf` with PDE tabbed editor. Select the 'Runtime' tab and then:
- clear out exported packages section then add all com.spotify.docker.client* packages back - clear out exported packages section then add all `com.github.dockerjava*` packages back
- clear our 'classpath' section and all jars in the 'dependency folder. - clear our 'classpath' section and all jars in the 'dependency folder.

View File

@@ -0,0 +1,25 @@
# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.
# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
#org.slf4j.simpleLogger.defaultLogLevel=debug
# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=
# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false
# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
#org.slf4j.simpleLogger.logFile=/tmp/sts-docker-client.log
#org.slf4j.simpleLogger.log.com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager=debug

View File

@@ -0,0 +1,15 @@
#!/bin/bash
set -e
version_override=99.99.99-SNAPSHOT
export JAVA_HOME=/home/kdvolder/Applications/jdk1.8.0_271
cd ~/git/kdvolder/docker-java
./mvnw versions:set -DnewVersion=${version_override}
./mvnw clean package -Dmaven.test.skip=true
for f in \
docker-java-transport/target/docker-java-transport-${version_override}.jar \
docker-java-transport-zerodep/target/docker-java-transport-zerodep-${version_override}.jar \
docker-java-core/target/docker-java-core-${version_override}.jar \
docker-java-api/target/docker-java-api-${version_override}.jar
do
cp $f ~/git/sts4/eclipse-extensions/org.springframework.ide.eclipse.docker.client/dependency/
done

8
local-build.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/bin/bash
#export JAVA_HOME=/home/kdvolder/Applications/jdk-11.0.8+10
set -e
workdir=$(pwd)
cd $workdir/eclipse-language-servers
./local-build.sh
cd $workdir/eclipse-distribution
./local-build.sh