diff --git a/core/src/main/java/org/testcontainers/dockerclient/UnixSocketClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/UnixSocketClientProviderStrategy.java index c262bda1db5..49e176a5f6b 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/UnixSocketClientProviderStrategy.java +++ b/core/src/main/java/org/testcontainers/dockerclient/UnixSocketClientProviderStrategy.java @@ -13,7 +13,7 @@ * @deprecated this class is used by the SPI and should not be used directly */ @Deprecated -public final class UnixSocketClientProviderStrategy extends DockerClientProviderStrategy { +public class UnixSocketClientProviderStrategy extends DockerClientProviderStrategy { protected static final String DOCKER_SOCK_PATH = "/var/run/docker.sock"; @@ -25,12 +25,19 @@ public final class UnixSocketClientProviderStrategy extends DockerClientProvider @Override public TransportConfig getTransportConfig() throws InvalidConfigurationException { - Path dockerSocketFile = Paths.get(DOCKER_SOCK_PATH); + String socketPath = DOCKER_SOCK_PATH; + String envPath = getDockerHostEnv(); + + if (envPath != null && envPath.startsWith("unix://")) { + socketPath = envPath.replace("unix://", ""); + } + + Path dockerSocketFile = Paths.get(socketPath); Integer mode; try { mode = (Integer) Files.getAttribute(dockerSocketFile, "unix:mode"); } catch (IOException e) { - throw new InvalidConfigurationException("Could not find unix domain socket", e); + throw new InvalidConfigurationException("Could not find unix domain socket: " + socketPath, e); } if ((mode & 0xc000) != SOCKET_FILE_MODE_MASK) { @@ -39,7 +46,14 @@ public TransportConfig getTransportConfig() throws InvalidConfigurationException ); } - return TransportConfig.builder().dockerHost(URI.create(SOCKET_LOCATION)).build(); + return TransportConfig.builder().dockerHost(URI.create("unix://" + socketPath)).build(); + } + + /** + * Visible for testing. + */ + protected String getDockerHostEnv() { + return System.getenv("DOCKER_HOST"); } @Override diff --git a/core/src/test/java/org/testcontainers/dockerclient/UnixSocketClientProviderStrategyTest.java b/core/src/test/java/org/testcontainers/dockerclient/UnixSocketClientProviderStrategyTest.java new file mode 100644 index 00000000000..56e1120858f --- /dev/null +++ b/core/src/test/java/org/testcontainers/dockerclient/UnixSocketClientProviderStrategyTest.java @@ -0,0 +1,28 @@ +package org.testcontainers.dockerclient; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; + +class UnixSocketClientProviderStrategyTest { + + @Test + void shouldRespectDockerHostEnvVar() { + String customSocketPath = "/tmp/test-socket-path"; + String envVarValue = "unix://" + customSocketPath; + + UnixSocketClientProviderStrategy strategy = new UnixSocketClientProviderStrategy() { + @Override + protected String getDockerHostEnv() { + return envVarValue; + } + }; + + Throwable thrown = catchThrowable(strategy::getTransportConfig); + + assertThat(thrown) + .as("Strategy should use path from DOCKER_HOST env var") + .hasMessageContaining(customSocketPath); + } +}