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网络:
- 先查看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
相关产品推荐
相关产品推荐

