Micronaut本地/测试可连数据库,Docker镜像运行遇Dialect识别错误
Micronaut + PostgreSQL Docker运行时方言识别失败问题
本地运行及测试Micronaut项目(使用PostgreSQL)完全正常,但生成Docker镜像运行时出现以下错误:
Caused by: org.hibernate.HibernateException: HR000048: Could not determine Dialect from JDBC driver metadata (specify a connection URI with scheme 'postgresql:', 'mysql:', 'cockroachdb', or 'db2:')
已尝试的配置
根据官方文档要求,生产环境需将Test Resources注入的属性指向真实数据库,可通过环境变量实现。已参考JDBC相关指南配置application.yaml:
micronaut: application: name: micronaut-guide netty: default: allocator: max-order: 3 #tag::jpa[] jpa: default: entity-scan: packages: - 'example.micronaut.domain' properties: hibernate: show-sql: true hbm2ddl: auto: update connection: db-type: postgres reactive: true #end::jpa[] datasources: default: driverClassName: org.postgresql.Driver db-type: postgresql schema-generate: CREATE_DROP dialect: POSTGRES jpa.default.properties.hibernate.hbm2ddl.auto: update
运行Docker容器时已传递环境变量:
docker run micronaut-postgres -p 8080:8080 --rm -e DATASOURCES_DEFAULT_URL=$DATASOURCES_DEFAULT_URL -e DATASOURCES_DEFAULT_USERNAME=$DATASOURCES_DEFAULT_USERNAME -e DATASOURCES_DEFAULT_PASSWORD=$DATASOURCES_DEFAULT_PASSWORD
本地环境变量验证:
◼ ~/Code/Personal/micronaut-postgres $ echo $DATASOURCES_DEFAULT_URL 130 jdbc:postgresql://localhost:3306/db
项目build.gradle配置:
plugins { id("org.jetbrains.kotlin.jvm") version "1.6.21" id("org.jetbrains.kotlin.kapt") version "1.6.21" id("org.jetbrains.kotlin.plugin.allopen") version "1.6.21" id("org.jetbrains.kotlin.plugin.jpa") version "1.6.21" id("com.github.johnrengelman.shadow") version "7.1.2" id("io.micronaut.application") version "3.6.7" id("io.micronaut.test-resources") version "3.6.7" } version = "0.1" group = "example.micronaut" repositories { mavenCentral() } dependencies { kapt("io.micronaut.data:micronaut-data-processor") kapt("io.micronaut:micronaut-http-validation") kapt("io.micronaut.serde:micronaut-serde-processor") implementation("io.micronaut:micronaut-http-client") implementation("io.micronaut.data:micronaut-data-hibernate-reactive") implementation("io.micronaut.kotlin:micronaut-kotlin-runtime") implementation("io.micronaut.reactor:micronaut-reactor") implementation("io.micronaut.reactor:micronaut-reactor-http-client") implementation("com.ongres.scram:client:2.1") implementation("io.micronaut.serde:micronaut-serde-jackson") // implementation("io.vertx:vertx-mysql-client") implementation("io.vertx:vertx-pg-client") implementation("io.micronaut.sql:micronaut-vertx-pg-client") implementation("jakarta.annotation:jakarta.annotation-api") implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}") runtimeOnly("ch.qos.logback:logback-classic") // testResourcesService("mysql:mysql-connector-java") testResourcesService("org.postgresql:postgresql") compileOnly("org.graalvm.nativeimage:svm") implementation("io.micronaut.sql:micronaut-vertx-pg-client") implementation("io.micronaut:micronaut-validation") runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin") } application { mainClass.set("example.micronaut.ApplicationKt") } java { sourceCompatibility = JavaVersion.toVersion("11") } tasks { compileKotlin { kotlinOptions { jvmTarget = "11" } } compileTestKotlin { kotlinOptions { jvmTarget = "11" } } } graalvmNative.toolchainDetection = false micronaut { runtime("netty") testRuntime("junit5") processing { incremental(true) annotations("example.micronaut.*") } testResources { additionalModules.add("hibernate-reactive-postgresql") } } tasks.named("dockerfile") { baseImage = "eclipse-temurin:17.0.5_8-jre-jammy" }
标准复现场景
在Micronaut官方JPA+Hibernate示例项目中,同样出现该问题:生成Docker镜像运行时触发相同错误。
镜像构建日志片段:
Step 8/8 : ENTRYPOINT ["java", "-jar", "/home/app/application.jar"] ---> [Warning] The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested ---> Running in b4ac7195ad12 Removing intermediate container b4ac7195ad12 ---> 98936716be8c Successfully built 98936716be8c Successfully tagged micronautguide:latest Created image with ID '98936716be8c'.
环境变量验证及运行命令:
$ echo $JDBC_URL jdbc:mysql://production-server:3306/micronaut $ docker run --rm -e DATASOURCES_DEFAULT_URL=$JDBC_URL -e DATASOURCES_DEFAULT_USERNAME=$JDBC_USER -e DATASOURCES_DEFAULT_PASSWORD=$JDBC_PASSWORD -it -p 8080:8080 98936716be8c 125 WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
运行时错误:
Caused by: org.hibernate.HibernateException: HR000048: Could not determine Dialect from JDBC driver metadata (specify a connection URI with scheme 'postgresql:', 'mysql:', 'cockroachdb', or 'db2:')
内容的提问来源于stack exchange,提问作者Bertuz
相关产品推荐
相关产品推荐

