Spring+PostgreSQL+Docker应用启动报错:不支持postgresql数据库名
Spring+PostgreSQL+Docker应用启动错误:Database name postgresql not supported
问题背景
搭建了Spring+PostgreSQL+Docker组合应用,相关配置如下:
application.properties
spring.datasource.password=rfnfdfcbz123! spring.datasource.username=postgres spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver spring.datasource.url=jdbc:tc:postgresql:11.1:///mesh_group spring.jpa.show-sql=true spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
Dockerfile
FROM openjdk:11 ADD /target/DockerLearn-0.0.1-SNAPSHOT.jar backend123.jar ENTRYPOINT ["java","-jar","/backend123.jar"]
docker-compose.yml
version: '3' services: postgres: image: 'postgres:11.1' container_name: 'java-postgres124' environment: - 'POSTGRES_USER=postgres' - 'POSTGRES_PASSWORD=rfnfdfcbz123!' - 'POSTGRES_DB=mesh_group' app: build: ./ container_name: 'java-app124' ports: - 8000:8080
运行java-app124容器时出现错误:
java.lang.UnsupportedOperationException: Database name postgresql not supported at org.testcontainers.jdbc.ContainerDatabaseDriver.connect(ContainerDatabaseDriver.java:106) ~[jdbc-1.17.3.jar!/:na] at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar!/:na] at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar!/:na] at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:na] at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar!/:na] at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar!/:na] at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar!/:na] at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar!/:na] at
错误原因
- 配置冲突:同时使用了Testcontainers的JDBC驱动(自动启动数据库容器)和docker-compose手动启动的PostgreSQL容器,两者逻辑矛盾。
- 容器内运行限制:Testcontainers的JDBC驱动需要访问Docker daemon来启动数据库容器,但应用本身运行在Docker容器内,默认无法直接访问宿主机的Docker环境,导致驱动无法识别并启动PostgreSQL容器,抛出该错误。
解决办法
方案一:连接docker-compose中的PostgreSQL容器(生产/部署场景推荐)
修改application.properties,移除Testcontainers相关配置,直接连接到docker-compose中定义的PostgreSQL服务:
spring.datasource.password=rfnfdfcbz123! spring.datasource.username=postgres # 替换为PostgreSQL官方驱动 spring.datasource.driver-class-name=org.postgresql.Driver # 使用docker-compose服务名作为数据库主机(同一网络内可直接通过服务名访问) spring.datasource.url=jdbc:postgresql://postgres:5432/mesh_group spring.jpa.show-sql=true spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
同步更新docker-compose.yml,添加服务依赖确保应用在PostgreSQL启动后再启动:
version: '3' services: postgres: image: 'postgres:11.1' container_name: 'java-postgres124' environment: - 'POSTGRES_USER=postgres' - 'POSTGRES_PASSWORD=rfnfdfcbz123!' - 'POSTGRES_DB=mesh_group' # 可选:暴露端口到宿主机,方便本地调试 ports: - 5432:5432 app: build: ./ container_name: 'java-app124' ports: - 8000:8080 # 确保应用服务在PostgreSQL服务启动后再启动 depends_on: - postgres
注意:确保项目依赖中包含PostgreSQL驱动包,Maven依赖示例:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency>
方案二:继续使用Testcontainers(仅测试场景适用)
如果需要在测试场景中用Testcontainers自动管理数据库,需做以下调整:
- 删除
docker-compose.yml中的postgres服务 - 配置应用容器访问宿主机的Docker daemon(需挂载宿主机Docker socket,存在安全风险,不推荐生产使用):
修改docker-compose.yml的app服务:app: build: ./ container_name: 'java-app124' ports: - 8000:8080 volumes: - /var/run/docker.sock:/var/run/docker.sock - 保留
application.properties中的Testcontainers配置
内容的提问来源于stack exchange,提问作者Землянский Григорий
相关产品推荐
相关产品推荐

