Spring集成Flyway与PostgreSQL的Docker部署中localhost:5432连接被拒绝问题求助
我来帮你排查和解决这个连接拒绝的问题,几个关键点需要调整:
1. 不要单独用docker run启动应用,必须通过Docker Compose管理容器
你之前执行的docker run命令会把应用容器放到Docker默认网络里,而你的PostgreSQL容器是在Docker Compose创建的专属网络中,两个网络不互通。这就导致应用容器里的localhost:5432指的是它自己,自然连不上数据库容器。
正确的启动方式是:
# 先构建镜像(如果有代码/配置修改的话) docker-compose build # 启动所有服务(-d表示后台运行) docker-compose up -d
2. 修正Flyway服务的冗余/错误配置
你的Flyway服务里设置了一堆POSTGRES_*环境变量,但这些变量对boxfuse/flyway镜像完全没用,反而POSTGRES_HOST=postgres是错误的(你的数据库服务名是air-travels-api-db)。直接删掉这些冗余环境变量,保留你已经写对的command参数即可:
修改后的flyway服务配置:
flyway: image: boxfuse/flyway:5-alpine command: -url=jdbc:postgresql://air-travels-api-db:5432/air-travels-api -schemas=public -user=postgres -password=postgres migrate volumes: - ./migration:/flyway/sql depends_on: - air-travels-api-db
3. 解决depends_on不等待数据库就绪的问题
depends_on只会保证服务的启动顺序,不会等待PostgreSQL完全启动并接受连接。Flyway和Spring应用可能在数据库还没准备好的时候就尝试连接,导致失败。
可以给PostgreSQL服务添加健康检查,让Docker Compose等待数据库就绪后再启动Flyway和API:
修改air-travels-api-db服务:
air-travels-api-db: image: postgres:12 restart: always ports: - "5432:5432" container_name: air-travels-api-db environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres POSTGRES_DB: air-travels-api healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d air-travels-api"] interval: 5s timeout: 5s retries: 5
然后给Flyway和API服务添加depends_on的健康检查依赖,确保启动时机正确:
air-travels-api: # ... 保留原有其他配置 ... depends_on: flyway: condition: service_completed_successfully air-travels-api-db: condition: service_healthy flyway: # ... 保留原有其他配置 ... depends_on: air-travels-api-db: condition: service_healthy
这样Flyway会等数据库健康后再执行迁移,API会等Flyway迁移完成后再启动,避免连接失败。
4. 修正Docker镜像命名问题
你执行的docker build -t air-travels-api.jar .把镜像名设成了air-travels-api.jar,但docker-compose里指定的镜像名是air-travels-api,这会导致docker-compose重新构建镜像。建议统一镜像名:
docker build -t air-travels-api .
或者直接用docker-compose build来构建,它会自动使用docker-compose里定义的镜像名,更省心。
最后验证步骤
- 停止并删除所有现有容器:
docker-compose down
- 清理旧镜像(可选,避免混淆):
docker rmi air-travels-api.jar air-travels-api
- 重新构建并启动:
docker-compose build docker-compose up -d
- 查看日志确认服务正常:
docker-compose logs -f air-travels-api
这样应该就能彻底解决连接拒绝的问题了。
内容的提问来源于stack exchange,提问作者DOKL57

