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)访问:
- 先确认PostgreSQL所在的网络:
docker inspect yola_postgres_1 | grep -A 5 Networks
- 运行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
相关产品推荐
相关产品推荐

