java.lang.IllegalStateException:找不到有效的 Docker 环境。请查看日志并检查配置

Posted

技术标签:

【中文标题】java.lang.IllegalStateException:找不到有效的 Docker 环境。请查看日志并检查配置【英文标题】:java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration 【发布时间】:2021-08-02 23:12:57 【问题描述】:

我有一个名为 myImageName:latest 的 docker 映像,我在我的应用程序中使用它。 我想为我的应用程序编写一个集成测试,因此我想使用 TestContainer 包。当我运行以下简单测试时:

@Testcontainers
public class myIntegrationTest

    @Container
    private GenericContainer container =
    new GenericContainer<>(DockerImageName.parse("myImageName:latest"))
    .withExposedPorts(8080);

    
    @Test
    public void myIntegrationTestName() throws Exception
        assertTrue(container.isRunning());
    


我收到以下错误(完整堆栈跟踪):

18:30:58.741 [main] 错误 org.testcontainers.dockerclient.DockerClientProviderStrategy - 找不到有效的 Docker 环境。请检查配置。尝试的配置是: 2 18:30:58.746 [main] 错误 org.testcontainers.dockerclient.DockerClientProviderStrategy - UnixSocketClientProviderStrategy:失败,出现异常 NoClassDefFoundError(无法初始化类 org.testcontainers.shaded.com.github.dockerjava.core.DefaultObjectMapperHolder) 18:30:58.747 [main] 错误 org.testcontainers.dockerclient.DockerClientProviderStrategy - 由于未找到有效配置,因此无法继续执行

在 org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:215) 在 java.base/java.util.Optional.orElseThrow(Optional.java:408) 在 org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:207) 在 org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:136) 在 org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:178) 在 org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14) 在 org.testcontainers.LazyDockerClient.authConfig(LazyDockerClient.java:12) 在 org.testcontainers.containers.GenericContainer.start(GenericContainer.java:310) 在 org.testcontainers.junit.jupiter.TestcontainersExtension$StoreAdapter.start(TestcontainersExtension.java:242) 在 org.testcontainers.junit.jupiter.TestcontainersExtension$StoreAdapter.access$200(TestcontainersExtension.java:229) 在 org.testcontainers.junit.jupiter.TestcontainersExtension.lambda$null$4(TestcontainersExtension.java:82) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore.lambda$getOrComputeIfAbsent$4(ExtensionValuesStore.java:86) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore$MemoizingSupplier.get(ExtensionValuesStore.java:205) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore$StoredValue.evaluate(ExtensionValuesStore.java:182) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore$StoredValue.access$100(ExtensionValuesStore.java:171) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore.lambda$closeAllStoredCloseableValues$1(ExtensionValuesStore.java:65) 在 java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176) 在 java.base/java.util.concurrent.ConcurrentHashMap$ValueSpliterator.forEachRemaining(ConcurrentHashMap.java:3605) 在 java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) 在 java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) 在 java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) 在 java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) 在 java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 在 java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) 在 org.junit.jupiter.engine.execution.ExtensionValuesStore.closeAllStoredCloseableValues(ExtensionValuesStore.java:68) 在 org.junit.jupiter.engine.descriptor.AbstractExtensionContext.close(AbstractExtensionContext.java:74) 在 org.junit.jupiter.engine.execution.JupiterEngineExecutionContext.close(JupiterEngineExecutionContext.java:53) 在 org.junit.jupiter.engine.descriptor.JupiterTestDescriptor.cleanUp(JupiterTestDescriptor.java:222) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.cleanUp(TestMethodTestDescriptor.java:148) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.cleanUp(TestMethodTestDescriptor.java:65) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$cleanUp$9(NodeTestTask.java:155) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.cleanUp(NodeTestTask.java:155) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:87) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1541) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) 在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1541) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) 在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) 在 org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:84) 在 org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

docker v20.10.5 junit v5.7 TestContainer v1.15.3 jdk v11.0.10

提前谢谢你!

【问题讨论】:

在那个stacktrace之前应该还有一些以前的日志信息,请检查一下,应该有原因。 嗨维塔利,感谢您的评论。我编辑了帖子,在错误之前添加了日志。 org.testcontainers.dockerclient.DockerClientProviderStrategy - UnixSocketClientProviderStrategy: failed with exception NoClassDefFoundError (Could not initialize class org.testcontainers.shaded.com.github.dockerjava.core.DefaultObjectMapperHolder 【参考方案1】:

我在 pom.xml 中添加了以下依赖项:

<dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-annotations</artifactId>
 <version>2.10.5</version>
</dependency>

这个包缺少类:

DefaultObjectMapperHolder

【讨论】:

【参考方案2】:

我在使用 Rancher 桌面时遇到了类似的异常。为了检查 docker 是否运行正常,我跑了

$ docker compose ls
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

根据这些信息,我得出结论,rancher 桌面 docker 环境存在问题。 重启 Rancher 桌面后,错误消失了。

【讨论】:

以上是关于java.lang.IllegalStateException:找不到有效的 Docker 环境。请查看日志并检查配置的主要内容,如果未能解决你的问题,请参考以下文章