You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring集成Flyway与PostgreSQL的Docker部署中localhost:5432连接被拒绝问题求助

解决PostgreSQL连接拒绝问题的步骤

我来帮你排查和解决这个连接拒绝的问题,几个关键点需要调整:


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里定义的镜像名,更省心。


最后验证步骤

  1. 停止并删除所有现有容器:
docker-compose down
  1. 清理旧镜像(可选,避免混淆):
docker rmi air-travels-api.jar air-travels-api
  1. 重新构建并启动:
docker-compose build
docker-compose up -d
  1. 查看日志确认服务正常:
docker-compose logs -f air-travels-api

这样应该就能彻底解决连接拒绝的问题了。

内容的提问来源于stack exchange,提问作者DOKL57

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:32:47