Docker+Jenkins环境下Flyway无法连接PostgreSQL求助
通过Docker部署Jenkins(通过主机Docker套接字管理主机Docker服务),PostgreSQL已作为Docker容器部署并暴露5432端口,运行正常。但在Jenkins流水线中以Docker容器运行Flyway时,无论如何配置flyway.url都无法连接数据库,报错:
ERROR: Unable to connect to the database. Configure the url, user and password!
相关配置与信息
conf\flyway.conf
flyway.url=jdbc:postgresql://192.168.29.2:5432/postgres flyway.user=postgres flyway.password=alpine98 flyway.connectRetries=60
Jenkinsfile
pipeline { agent any stages { stage('Checkout') { steps { checkout scm } } stage('Temp'){ steps { sh 'docker ps' } } stage('Version Check'){ steps { sh 'docker run --rm flyway/flyway:9.15 version' } } stage('Migration') { steps { sh 'docker run --rm -v $WORKSPACE/db/migration:/flyway/sql -v $WORKSPACE/conf:/flyway/conf flyway/flyway:9.15 migrate' } } stage('Validation') { steps { sh 'docker run --rm -v $WORKSPACE/db/migration:/flyway/sql -v $WORKSPACE/conf:/flyway/conf flyway/flyway:9.15 validate' } } stage('Information') { steps { sh 'docker run --rm -v $WORKSPACE/db/migration:/flyway/sql -v $WORKSPACE/conf:/flyway/conf flyway/flyway:9.15 info' } } } }
主机Docker容器列表
- Jenkins:172.17.0.2,暴露8080、50000端口
- Postgres:172.17.0.3,暴露5432端口
- Flyway:Jenkins任务运行时启动
所有容器均使用默认bridge网络
Jenkins任务输出
+ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 52365808825e portainer/portainer-ce:latest "/portainer" 13 hours ago Up 13 hours 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp portainer ed6e91f86feb gitea/gitea:1.18.5 "/usr/bin/entrypoint…" 13 hours ago Up 13 hours 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:222->22/tcp, :::222->22/tcp gitea fa32180a9a8c postgres "docker-entrypoint.s…" 13 hours ago Up 13 hours 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres 1f169b2b6f9c jenkins/jenkins:lts "/usr/bin/tini -- /u…" 13 hours ago Up 12 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Version Check) [Pipeline] sh + docker run --rm flyway/flyway:9.15 version Flyway Community Edition 9.15.2 by Redgate Plugin Name | Version | Licensed --------------------- | ------- | -------- SqlFluffRulesEngine | 1.2.1 | Licensed [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Migration) [Pipeline] sh + docker run --rm -v /var/jenkins_home/workspace/ecp-flyway-integration_main/db/migration:/flyway/sql -v /var/jenkins_home/workspace/ecp-flyway-integration_main/conf:/flyway/conf flyway/flyway:9.15 migrate ERROR: Unable to connect to the database. Configure the url, user and password! [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Validation) Stage "Validation" skipped due to earlier failure(s) [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Information) Stage "Information" skipped due to earlier failure(s) [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: script returned exit code 1 Finished: FAILURE
解决方案
原因分析
Flyway容器运行在默认bridge网络中,直接使用主机IP192.168.29.2可能因网络隔离、防火墙规则或路由问题无法连通PostgreSQL;默认bridge网络内容器间可通过容器名/IP直接通信,当前配置未利用该特性。
具体修复步骤
使用容器名直接访问PostgreSQL
默认bridge网络支持容器名DNS解析,修改flyway.conf中的连接地址:flyway.url=jdbc:postgresql://postgres:5432/postgres同时显式指定Flyway容器使用bridge网络(确保与PostgreSQL同网络),修改Jenkinsfile中相关阶段命令:
docker run --rm --network bridge -v $WORKSPACE/db/migration:/flyway/sql -v $WORKSPACE/conf:/flyway/conf flyway/flyway:9.15 migrate或使用Docker内部网关地址
Docker默认bridge网络的网关通常为172.17.0.1(可通过docker network inspect bridge确认),修改flyway.conf:flyway.url=jdbc:postgresql://172.17.0.1:5432/postgres此方式通过主机网关访问暴露的5432端口,需确保主机防火墙允许Docker内部网络访问该端口。
验证连通性
在Jenkins流水线中添加测试步骤,确认Flyway容器能连通PostgreSQL:# 测试ping连通性 sh 'docker run --rm --network bridge busybox ping -c 3 postgres' # 测试端口连通性 sh 'docker run --rm --network bridge busybox telnet postgres 5432'
额外建议
- 放弃默认bridge网络,创建自定义Docker网络(如
docker network create jenkins-net),将Jenkins、PostgreSQL、Flyway都加入该网络,网络内通信更稳定且DNS解析更可靠。 - 检查PostgreSQL容器环境变量,确认
POSTGRES_USER、POSTGRES_PASSWORD与Flyway配置一致,且PostgreSQL未绑定仅本地访问的地址(如127.0.0.1)。
内容的提问来源于stack exchange,提问作者Ajitesh Sivakumar

