Docker-Compose+Flyway启动报错:users数据库不存在的解决求助
问题描述
使用Docker Compose部署集成Flyway的Spring Boot应用时,启动userapi服务时出现错误,提示数据库users不存在,导致Flyway无法完成迁移,应用启动失败。
相关配置
application-prod.properties
spring.flyway.enabled=true spring.flyway.url=jdbc:postgresql://postgres:5432/users spring.flyway.user=postgres spring.flyway.password=1234 spring.flyway.locations=classpath:db/migration
docker-compose.yml
version: '3' services: postgres: image: postgres:latest environment: POSTGRES_DB: users POSTGRES_USER: postgres POSTGRES_PASSWORD: 1234 ports: - "5432:5432" volumes: - /srv/db_data:/var/lib/postgresql/data auth: build: context: ./auth ports: - "8080:8080" volumes: - /srv/photos:/srv/photos userapi: build: context: ./userApi ports: - "8081:8081" depends_on: - postgres
错误关键信息
postgres_1 | 2023-10-08 18:19:12.845 UTC [34] FATAL: database "users" does not exist userapi_1 | org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: FATAL: database "users" does not exist
解决方案
1. 清理PostgreSQL持久化数据
PostgreSQL官方镜像的POSTGRES_DB等初始化环境变量仅在第一次启动、数据目录为空时生效。如果/srv/db_data目录已经存在旧的数据库数据,容器不会重新创建users数据库。
执行以下命令清理旧数据后重新启动:
# 停止并移除所有相关容器 docker-compose down # 删除持久化数据目录 sudo rm -rf /srv/db_data # 重新构建并启动服务 docker-compose up --build
2. 修复服务启动顺序问题
depends_on仅保证postgres容器先启动,但不保证PostgreSQL服务已经完全就绪(比如完成初始化、可以接受连接)。userapi启动时可能PostgreSQL还没准备好,导致连接失败。
修改docker-compose.yml,给postgres添加健康检查,让userapi等待PostgreSQL就绪后再启动:
version: '3' services: postgres: image: postgres:latest environment: POSTGRES_DB: users POSTGRES_USER: postgres POSTGRES_PASSWORD: 1234 ports: - "5432:5432" volumes: - /srv/db_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d users"] interval: 5s timeout: 5s retries: 5 auth: build: context: ./auth ports: - "8080:8080" volumes: - /srv/photos:/srv/photos userapi: build: context: ./userApi ports: - "8081:8081" depends_on: postgres: condition: service_healthy
3. 验证配置正确性
- 确认
POSTGRES_DB环境变量拼写无误,PostgreSQL数据库名默认区分大小写,需保证和Flyway JDBC URL中的users完全一致。 - 检查Flyway配置中的用户名、密码和PostgreSQL的
POSTGRES_USER、POSTGRES_PASSWORD匹配。
内容的提问来源于stack exchange,提问作者therepanic
相关产品推荐
相关产品推荐

