Spring Boot 3.1.5 Docker化连接PostgreSQL报错:数据库不存在
解决Spring Boot + Docker Compose连接PostgreSQL时数据库不存在的问题
使用Spring Boot 3.1.5、Java 17和Maven,首次尝试通过Docker Compose将Spring Boot应用容器化并连接PostgreSQL数据库,配置相关文件后启动报错:
Caused by: org.postgresql.util.PSQLException: FATAL: database "desafio_stone_docker" does not exist.
调整配置(添加spring-boot-docker-compose依赖、简化配置)后问题依旧,以下是具体排查和解决方法:
可能的原因及解决步骤
1. 数据库初始化延迟
PostgreSQL容器启动后需要一定时间完成初始化,Spring Boot应用可能在数据库就绪前发起连接,导致找不到目标数据库。
- 解决方法:
- 在docker-compose.yml中为PostgreSQL服务添加健康检查,确保数据库就绪后再允许外部连接:
version: '3.8' services: db: image: postgres:alpine ports: - "5432:5432" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: desafio_stone_docker healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d desafio_stone_docker"] interval: 5s timeout: 5s retries: 5 - 在Spring Boot配置中添加连接重试机制,修改application-dev.yml:
spring: datasource: url: jdbc:postgresql://db:5432/desafio_stone_docker username: postgres password: postgres hikari: connection-timeout: 20000 initialization-fail-timeout: 0 # 无限等待直到连接成功 sql: init: mode: always
- 在docker-compose.yml中为PostgreSQL服务添加健康检查,确保数据库就绪后再允许外部连接:
2. 配置优先级冲突
同时存在application.yml和application-dev.yml,且激活了dev环境,需确保dev配置完全覆盖主配置中的数据库参数:
- 解决方法:
修改application.yml,移除主配置中的数据库连接信息,让dev配置完全接管:spring: profiles: active: dev jpa: properties: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect format_sql: true hibernate: ddl-auto: update show-sql: false
3. 容器数据卷残留
若之前启动过PostgreSQL容器,数据卷中可能残留旧数据,导致新容器未正确创建目标数据库:
- 解决方法:
停止并彻底删除容器及关联数据卷,重新启动:docker-compose down -v docker-compose up
4. 验证数据库是否创建成功
手动进入PostgreSQL容器,检查目标数据库是否存在:
# 进入容器 docker exec -it db psql -U postgres # 列出所有数据库 \l
若列表中无desafio_stone_docker,需检查docker-compose.yml中的环境变量是否拼写正确(比如POSTGRES_DB是否误写为POSTGRES_DATABASE)。
内容的提问来源于stack exchange,提问作者Francislainy Campos
相关产品推荐
相关产品推荐

