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

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直接通信,当前配置未利用该特性。

具体修复步骤

  1. 使用容器名直接访问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
    
  2. 或使用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内部网络访问该端口。

  3. 验证连通性
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:55:06