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

Flyway连接PostgreSQL失败,但psql命令行可正常连接

问题分析与解决

你的PostgreSQL Docker服务运行正常,本地终端能连接,但Flyway用Docker容器运行时连接失败,核心原因是Docker容器内的localhost指向容器自身,而非宿主机。当你在Flyway容器里访问localhost:5432,实际是在访问Flyway容器自己的5432端口,而非宿主机上映射的PostgreSQL端口。

以下是两种可行的解决方法:

方法一:使用宿主机可访问的地址

针对Windows/macOS

Docker提供了host.docker.internal这个特殊域名,用来在容器内访问宿主机。修改Flyway命令如下:

docker run --rm -v /path/to/folder/migrations:/flyway/sql flyway/flyway -url=jdbc:postgresql://host.docker.internal:5432/yola -user=postgres -password=password123 info

针对Linux

方式1:使用宿主机网关IP

Linux下Docker默认网关通常是172.17.0.1(可通过ip addr show docker0查看),替换到URL中:

docker run --rm -v /path/to/folder/migrations:/flyway/sql flyway/flyway -url=jdbc:postgresql://172.17.0.1:5432/yola -user=postgres -password=password123 info

方式2:使用宿主机网络

让Flyway容器直接使用宿主机网络,此时容器内的localhost就等同于宿主机的localhost:

docker run --rm --net=host -v /path/to/folder/migrations:/flyway/sql flyway/flyway -url=jdbc:postgresql://localhost:5432/yola -user=postgres -password=password123 info

方法二:加入PostgreSQL所在的Docker网络

如果你的PostgreSQL是通过docker-compose启动的,它会默认加入一个以项目名命名的网络(比如yola_default)。将Flyway容器加入同一个网络后,就能直接用PostgreSQL的服务名(postgres)访问:

  1. 先确认PostgreSQL所在的网络:
docker inspect yola_postgres_1 | grep -A 5 Networks
  1. 运行Flyway时指定该网络:
docker run --rm --network=yola_default -v /path/to/folder/migrations:/flyway/sql flyway/flyway -url=jdbc:postgresql://postgres:5432/yola -user=postgres -password=password123 info

你之前尝试用容器名yola_postgres_1失败,是因为Flyway容器和PostgreSQL容器不在同一个网络,无法通过容器名解析对方地址。加入同一网络后,无论是服务名还是容器名都能正常访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:05:31