RancherDesktop on MacOs not working with JUnit Testcontainers
Asked Answered
J

3

7

I'm trying to run a JUnit test using Testcontainers on my MacOs running Rancher Desktop. The docker CLI works fine as I can run any container using docker run.

The source code of the JUnit test looks as follows (simplified and shortened):

@Testcontainers
class FactoryDiscoveryDataIT {

  @Container
  private static final PostgreSQLContainer POSTGRES_CONTAINER =  new PostgreSQLContainer("postgres:11.11-alpine")
        .withDatabaseName("psql-link-test");

The error message is the following:

2023-03-08 08:14:28,816 ERROR [main] org.testcontainers.dockerclient.DockerClientProviderStrategy: Could not find a valid Docker environment. Please check configuration. Attempted configurations were:
2023-03-08 08:14:28,816 ERROR [main] org.testcontainers.dockerclient.DockerClientProviderStrategy:     UnixSocketClientProviderStrategy: failed with exception InvalidConfigurationException (Could not find unix domain socket). Root cause NoSuchFileException (/var/run/docker.sock)
2023-03-08 08:14:28,816 ERROR [main] org.testcontainers.dockerclient.DockerClientProviderStrategy: As no valid configuration was found, execution cannot continue

Test ignored.

java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration

    at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$6(DockerClientProviderStrategy.java:257)
    at java.base/java.util.Optional.orElseThrow(Optional.java:403)
    at org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:247)
    at org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:135)
    at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:171)
    at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:89)
    at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:108)
    at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
    at org.testcontainers.junit.jupiter.TestcontainersExtension$StoreAdapter.start(TestcontainersExtension.java:242)
    at org.testcontainers.junit.jupiter.TestcontainersExtension$StoreAdapter.access$200(TestcontainersExtension.java:229)
    at org.testcontainers.junit.jupiter.TestcontainersExtension.lambda$null$1(TestcontainersExtension.java:56)
    at org.junit.jupiter.engine.execution.ExtensionValuesStore.lambda$getOrComputeIfAbsent$4(ExtensionValuesStore.java:86)
    at org.junit.jupiter.engine.execution.ExtensionValuesStore$MemoizingSupplier.computeValue(ExtensionValuesStore.java:223)
    at org.junit.jupiter.engine.execution.ExtensionValuesStore$MemoizingSupplier.get(ExtensionValuesStore.java:211)
    at org.junit.jupiter.engine.execution.ExtensionValuesStore$StoredValue.evaluate(ExtensionValuesStore.java:191)
    at org.junit.jupiter.engine.execution.ExtensionValuesStore$StoredValue.access$100(ExtensionValuesStore.java:171)
    at org.junit.jupiter.engine.execution.ExtensionValuesStore.getOrComputeIfAbsent(ExtensionValuesStore.java:89)
    at org.junit.jupiter.engine.execution.NamespaceAwareStore.getOrComputeIfAbsent(NamespaceAwareStore.java:53)
    at org.testcontainers.junit.jupiter.TestcontainersExtension.lambda$beforeAll$2(TestcontainersExtension.java:56)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.testcontainers.junit.jupiter.TestcontainersExtension.beforeAll(TestcontainersExtension.java:55)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllCallbacks$10(ClassBasedTestDescriptor.java:381)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllCallbacks(ClassBasedTestDescriptor.java:381)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:205)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:80)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:148)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
    at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
    at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
    at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

I'm quite sure the code is correct, as it works with my minikube config. For minikube I can set the env variables exported by minikube docker-env to use minikube as a build environment, which works fine.

Is there a similar solution for Rancher Desktop? Is there any other way to let JUnit Testcontainers use my Rancher Desktop installation?

Jiminez answered 8/3, 2023 at 7:27 Comment(1)
As per Rancher Desktop docs, there should be a Unix socket at /var/run/docker.sock. What is the output of ls /var/run/docker.sock ?Incult
I
4

This issue is unrelated to JUnit, it is about configuring Testcontainers for Rancher Desktop.

Other Testcontainers users report, that Rancher Desktop works out of the box once it is configured correctly (switch to Moby container runtime) since it creates a socket on the host at /var/run/docker.sock, so make sure to not have any of the Testcontainers environment variable configs set.

Incult answered 9/3, 2023 at 7:54 Comment(1)
Thanks that was the correct answer. In addition you need to enable administrative access for Rancher Desktop (which failed in older MacOs versions, but now seems to work).Jiminez
D
9

Using:

  • macOS Ventura 13.4.1
  • Apple M2 Pro
  • Rancher Desktop 1.9.1 - dockerd (moby)
  • TestContainers 1.18.3

Execute:

sudo ln -s $HOME/.rd/docker.sock /var/run/docker.sock

Then should work.

Dannica answered 21/7, 2023 at 8:55 Comment(1)
Came here for this :-)Chill
I
4

This issue is unrelated to JUnit, it is about configuring Testcontainers for Rancher Desktop.

Other Testcontainers users report, that Rancher Desktop works out of the box once it is configured correctly (switch to Moby container runtime) since it creates a socket on the host at /var/run/docker.sock, so make sure to not have any of the Testcontainers environment variable configs set.

Incult answered 9/3, 2023 at 7:54 Comment(1)
Thanks that was the correct answer. In addition you need to enable administrative access for Rancher Desktop (which failed in older MacOs versions, but now seems to work).Jiminez
R
3

As mentioned on the comment above, make sure you enable "Administrative Access" on Rancher Desktop Preferences, otherwise it will keep failing with Caused by: java.lang.IllegalStateException: Could not find a valid Docker environment.

Recalesce answered 14/6, 2023 at 9:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.