【问题标题】:Quarkus cannot find valid Docker environment for databasesQuarkus 无法为数据库找到有效的 Docker 环境
【发布时间】:2021-06-23 22:54:27
【问题描述】:

当我将 quarkus.datasource.db-kind 放入 derby 或 h2 时,quarkusDev 运行良好。

但是,当我尝试将 quarkus.datasource.db-kind 放入 db2 时(尝试使用相同结果的 postgresql),我收到以下错误: java.lang.IllegalStateException: 找不到有效的 Docker 环境。

我假设 quarkus 正在尝试获取一个 docker 容器来启动数据库,但找不到它。 quarkus 试图以 quarkusDev 模式启动数据库确实有点奇怪,但无论如何。

有人知道如何解决这个问题吗?

错误:

    2021-06-23 10:59:21,159 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor#launchDatabases threw an exception: java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration
        at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:215)
        at java.base/java.util.Optional.orElseThrow(Optional.java:408)
        at org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:207)
        at org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:136)
        at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:178)
        at org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14)
        at org.testcontainers.LazyDockerClient.authConfig(LazyDockerClient.java:12)
        at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:310)
        at io.quarkus.devservices.db2.deployment.DB2DevServicesProcessor$1.startDatabase(DB2DevServicesProcessor.java:31)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:217)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.launchDatabases(DevServicesDatasourceProcessor.java:103)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:920)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
        at java.base/java.lang.Thread.run(Thread.java:834)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)

        at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:396)
        at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:269)
        at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:66)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:79)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:378)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:56)
        at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:127)
        at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:84)
        at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:144)
        at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:63)
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
        [error]: Build step io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor#launchDatabases threw an exception: java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration
        at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:215)
        at java.base/java.util.Optional.orElseThrow(Optional.java:408)
        at org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:207)
        at org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:136)
        at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:178)
        at org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14)
        at org.testcontainers.LazyDockerClient.authConfig(LazyDockerClient.java:12)
        at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:310)
        at io.quarkus.devservices.db2.deployment.DB2DevServicesProcessor$1.startDatabase(DB2DevServicesProcessor.java:31)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:217)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.launchDatabases(DevServicesDatasourceProcessor.java:103)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:920)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
        at java.base/java.lang.Thread.run(Thread.java:834)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)

        at io.quarkus.builder.Execution.run(Execution.java:116)
        at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
        at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:153)
        at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:394)
        ... 9 more
Caused by: java.lang.IllegalStateException: Could not find a valid Docker environment. Please see logs and check configuration
        at org.testcontainers.dockerclient.DockerClientProviderStrategy.lambda$getFirstValidStrategy$7(DockerClientProviderStrategy.java:215)
        at java.base/java.util.Optional.orElseThrow(Optional.java:408)
        at org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:207)
        at org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:136)
        at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:178)
        at org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14)
        at org.testcontainers.LazyDockerClient.authConfig(LazyDockerClient.java:12)
        at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:310)
        at io.quarkus.devservices.db2.deployment.DB2DevServicesProcessor$1.startDatabase(DB2DevServicesProcessor.java:31)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.startDevDb(DevServicesDatasourceProcessor.java:217)
        at io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor.launchDatabases(DevServicesDatasourceProcessor.java:103)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:920)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
        at java.base/java.lang.Thread.run(Thread.java:834)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)

applications.properties(位于 main 中)

quarkus.datasource.db-kind = db2

quarkus.datasource.username = testdb
quarkus.datasource.password = testdb

quarkus.hibernate-orm.database.generation = update

gradle.properties:

#Gradle properties
#Wed Jun 23 10:41:16 CEST 2021
quarkusPluginVersion=1.13.2.Final
quarkusPlatformArtifactId=quarkus-universe-bom
quarkusPluginId=io.quarkus
quarkusPlatformGroupId=io.quarkus
//\#=-*- coding\: utf-8 -*-
systemProp.org.gradle.internal.publish.checksums.insecure=true
org.gradle.logging.level=INFO
org.gradle.jvmargs=-Xmx4096m
version=1.0.0-SNAPSHOT
quarkusPlatformVersion=1.13.2.Final

【问题讨论】:

  • 使用h2时出现问题?这很奇怪......
  • @geo 我认为情况正好相反,引用“当我将 quarkus.datasource.db-kind 放入 derby 或 h2 时,quarkusDev 运行良好”。
  • @NikosParaskevopoulos 完全正确。
  • 从堆栈跟踪看来,您的 TestContainers 配置有问题(?)可能在您的代码中查找 @QuarkusTestResource(?)
  • 好的,所以基本上当你使用quarkus.datasource.db-kind=postgresql 并且你没有设置quarkus.datasource.jdbc.url 你会得到你提到的行为,对吗?

标签: java quarkus


【解决方案1】:

您看到的是 Quarkus 试图启动一个容器来运行数据库,因为您没有指定 quarkus.datasource.jdbc.url。 此功能称为 DevServices,您可以找到有关它的更多信息here

当您尚未指定要使用的数据库时,此功能基本上会在开发和测试模式下启动。

您可以使用 quarkus.datasource.devservices.enabled=false 或将 quarkus.datasource.jdbc.url 设置为正在运行的数据库的 URL 来显式运行它

【讨论】:

  • 伟大的信息地理和:)
  • 很高兴它很有用:)
  • 太棒了!对我来说,问题是 quarkusDev 需要安装 docker 运行时应用程序才能启动 Testcontainer,根据这段视频:youtube.com/watch?v=szza3DZlKzA&t=166s 我只需要找到一种方法来启动本地数据库,然后通过quarkus.datasource.jdbc.url.
猜你喜欢
  • 2021-10-23
  • 2021-12-13
  • 2021-02-23
  • 2016-11-07
  • 2022-11-19
  • 2022-01-20
  • 2013-12-15
  • 2019-01-31
  • 2020-10-10
相关资源
最近更新 更多