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

Docker Compose中Flyway无法连接PostgreSQL求助

Flyway无法连接PostgreSQL容器的解决方法

问题根源

  • 容器网络寻址错误:Docker Compose内的容器各自属于独立网络节点,localhost在Flyway容器中指向自身,而非PostgreSQL容器。必须使用PostgreSQL服务名db作为数据库主机地址。
  • 启动顺序不匹配:Flyway可能在PostgreSQL完全就绪前就发起连接,失败后直接退出,导致无输出。
  • 独立容器网络隔离:单独运行Flyway容器时,默认不在PostgreSQL容器所在的网络,无法通过localhost访问宿主机映射的端口。

修复后的Docker Compose配置

修正数据库地址并添加启动依赖,确保Flyway在PostgreSQL就绪后再启动:

version: '3'

services:
  flyway:
    image: flyway/flyway
    # 用服务名db替代localhost
    command: -url=jdbc:postgresql://db:5432/restra -user=restra -password=restra -connectRetries=60 migrate
    volumes:
      - ${PWD}/resources/db/migrations:/flyway/sql
    # 依赖db服务且等待其健康检查通过
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres
    restart: always
    environment:
      - POSTGRES_USER=restra
      - POSTGRES_PASSWORD=restra
      # 建议移除trust认证,改用密码认证提升安全性
      # - POSTGRES_HOST_AUTH_METHOD=trust
    ports:
      - "5432:5432"
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-U", "restra" ]
      interval: 5s
      timeout: 1s
      retries: 5

单独测试Flyway连接的正确方式

如果要单独运行Flyway容器测试连接,需加入PostgreSQL容器所在的Compose网络:

  1. 先查看Compose创建的网络:
docker network ls

找到以你的项目名为前缀的default网络(例如restra_default)。
2. 运行Flyway容器时指定该网络:

docker run --rm --network=restra_default flyway/flyway -url=jdbc:postgresql://db:5432/restra -user=restra -password=restra info

若需通过宿主机端口访问,可使用主机网络(不推荐,会破坏容器网络隔离):

docker run --rm --network=host flyway/flyway -url=jdbc:postgresql://localhost:5432/restra -user=restra -password=restra info

额外建议

  • 移除POSTGRES_HOST_AUTH_METHOD=trust,依赖密码认证更符合生产环境安全规范。
  • 确保${PWD}/resources/db/migrations目录存在且包含合法的Flyway迁移脚本,否则Flyway可能因无脚本执行而无输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:02:57