Docker部署PostgreSQL后SpringBoot未使用指定数据库问题求助
问题:SpringBoot未连接指定PostgreSQL数据库,反而使用默认数据库
我是Docker新手,编写了如下docker-compose.yaml文件:
services: postgres: image: postgres container_name: postgres_db restart: unless-stopped ports: - "5432:5432" environment: POSTGRES_USER: suman POSTGRES_PASSWORD: password volumes: - postgres:/var/lib/postgresql - ./init.sql:/docker-entrypoint-initdb.d/init.sql networks: - network_establish pgadmin: image: dpage/pgadmin4 container_name: pgadmin_db restart: unless-stopped ports: - "5050:80" environment: PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-pgadmin4@pgadmin.org} PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin} PGADMIN_DEFAULT_SERVER_PORT: 5432 # Define port for PostgreSQL volumes: - pgadmin:/var/lib/pgadmin networks: - network_establish networks: network_establish: name: network_establish driver: bridge volumes: postgres: pgadmin:
同时SpringBoot的application.properties配置如下:
spring.application.name=mapping spring.datasource.url=jdbc:postgresql://localhost:5432/jpamapping spring.datasource.username=suman spring.datasource.password=password spring.jpa.database=POSTGRESQL spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
打开pgAdmin注册服务器后,默认生成了postgres和suman两个数据库。我通过init.sql创建了jpamapping数据库,但SpringBoot并未使用该数据库执行查询,反而将所有表创建在了suman数据库中。按配置应该使用jpamapping数据库才对,请问哪里配置出错了?
问题原因及解决办法
PostgreSQL用户默认数据库特性
PostgreSQL创建用户时,如果未指定默认数据库,会自动生成与用户名同名的数据库(即suman),该用户默认连接的就是这个同名库。排查及修复步骤
- 验证
init.sql执行效果:登录pgAdmin确认jpamapping数据库是否存在,或者查看Postgres容器日志(docker logs postgres_db)检查脚本是否执行成功。如果脚本是在容器启动后才添加的,需要删除持久化卷后重启容器让脚本生效:docker-compose down -v docker-compose up -d - 添加数据库权限:确保用户
suman拥有jpamapping的访问权限,在init.sql中补充授权语句:CREATE DATABASE jpamapping; GRANT ALL PRIVILEGES ON DATABASE jpamapping TO suman; - 查看SpringBoot连接日志:启动SpringBoot后,搜索日志中的
HikariPool相关内容,确认实际连接的数据库名称,排查URL是否生效。
- 验证
更简洁的配置方案
直接在docker-compose.yaml的Postgres服务中添加POSTGRES_DB环境变量,指定默认数据库为jpamapping,这样无需依赖init.sql创建库,用户suman会直接默认连接到该库:
services: postgres: # 其他配置不变 environment: POSTGRES_USER: suman POSTGRES_PASSWORD: password POSTGRES_DB: jpamapping # 添加这行
之后可以移除init.sql中创建数据库的语句,避免重复操作。
内容的提问来源于stack exchange,提问作者Suman Devkota
相关产品推荐
相关产品推荐

