diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java index 77ae311bb47..0d334f75cf6 100644 --- a/core/src/main/java/org/testcontainers/DockerClientFactory.java +++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java @@ -164,6 +164,9 @@ public String getRemoteDockerUnixSocketPath() { return dockerSocketOverride; } } + if (this.strategy != null && this.strategy.getRemoteDockerUnixSocketPath() != null) { + return this.strategy.getRemoteDockerUnixSocketPath(); + } URI dockerHost = getTransportConfig().getDockerHost(); String path = "unix".equals(dockerHost.getScheme()) ? dockerHost.getRawPath() : "/var/run/docker.sock"; diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java index 8a959b443c8..1f22eb6f85e 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java +++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java @@ -102,6 +102,13 @@ public boolean allowUserOverrides() { return true; } + /** + /* @return the path under which the Docker unix socket is reachable relative to the Docker daemon + */ + public String getRemoteDockerUnixSocketPath() { + return null; + } + /** * @return highest to lowest priority value */ diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerDesktopClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerDesktopClientProviderStrategy.java new file mode 100644 index 00000000000..b056733cfd2 --- /dev/null +++ b/core/src/main/java/org/testcontainers/dockerclient/DockerDesktopClientProviderStrategy.java @@ -0,0 +1,84 @@ +package org.testcontainers.dockerclient; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.SystemUtils; +import org.jetbrains.annotations.Nullable; + +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; + +/** + * Look at the following paths: + * + * + * @deprecated this class is used by the SPI and should not be used directly + */ +@Slf4j +@Deprecated +public class DockerDesktopClientProviderStrategy extends DockerClientProviderStrategy { + + public static final int PRIORITY = UnixSocketClientProviderStrategy.PRIORITY - 1; + + @Getter(lazy = true) + @Nullable + private final Path socketPath = resolveSocketPath(); + + private Path resolveSocketPath() { + Path linuxPath = Paths.get(System.getProperty("user.home")).resolve(".docker").resolve("desktop"); + return tryFolder(linuxPath) + .orElseGet(() -> { + Path macosPath = Paths.get(System.getProperty("user.home")).resolve(".docker").resolve("run"); + return tryFolder(macosPath).orElse(null); + }); + } + + @Override + public String getDescription() { + return "Rootless Docker accessed via Unix socket (" + getSocketPath() + ")"; + } + + @Override + public TransportConfig getTransportConfig() throws InvalidConfigurationException { + return TransportConfig.builder().dockerHost(URI.create("unix://" + getSocketPath().toString())).build(); + } + + @Override + protected int getPriority() { + return PRIORITY; + } + + @Override + protected boolean isPersistable() { + return false; + } + + @Override + public String getRemoteDockerUnixSocketPath() { + return "/var/run/docker.sock"; + } + + @Override + protected boolean isApplicable() { + return (SystemUtils.IS_OS_LINUX || SystemUtils.IS_OS_MAC) && this.socketPath != null; + } + + private Optional tryFolder(Path path) { + if (!Files.exists(path)) { + log.debug("'{}' does not exist.", path); + return Optional.empty(); + } + Path socketPath = path.resolve("docker.sock"); + if (!Files.exists(socketPath)) { + log.debug("'{}' does not exist.", socketPath); + return Optional.empty(); + } + return Optional.of(socketPath); + } +} diff --git a/core/src/main/resources/META-INF/services/org.testcontainers.dockerclient.DockerClientProviderStrategy b/core/src/main/resources/META-INF/services/org.testcontainers.dockerclient.DockerClientProviderStrategy index 62493d704a4..cae8bf53041 100644 --- a/core/src/main/resources/META-INF/services/org.testcontainers.dockerclient.DockerClientProviderStrategy +++ b/core/src/main/resources/META-INF/services/org.testcontainers.dockerclient.DockerClientProviderStrategy @@ -4,3 +4,4 @@ org.testcontainers.dockerclient.UnixSocketClientProviderStrategy org.testcontainers.dockerclient.DockerMachineClientProviderStrategy org.testcontainers.dockerclient.NpipeSocketClientProviderStrategy org.testcontainers.dockerclient.RootlessDockerClientProviderStrategy +org.testcontainers.dockerclient.DockerDesktopClientProviderStrategy