宿主机Liquibase连接Docker容器内Postgresql(无需Maven依赖)
宿主机Liquibase直连Docker内PostgreSQL 零Maven依赖配置方案
核心思路
整套流程完全把Liquibase作为宿主机上的独立进程运行,所有运行时依赖(核心程序、JDBC驱动)都从宿主机本地目录加载,和业务侧Maven项目完全解耦,自然不需要在项目pom中引入任何Liquibase、PG驱动相关依赖。
前置准备
- 安装独立可执行的Liquibase发行版,解压后即可通过
liquibase命令全局调用,不绑定Maven插件运行模式 - 下载对应版本的PostgreSQL JDBC驱动包,放入Liquibase安装目录下的
lib子文件夹,让Liquibase启动时自动加载驱动 - 确保业务Maven项目的pom配置完全不包含Liquibase相关依赖,数据库变更脚本统一由独立Liquibase进程执行
Docker PostgreSQL 连通性可靠配置
这部分是稳定连接的核心,避免出现容器重启后连不上的问题:
- 启动PG容器时必须做固定端口映射,不要依赖容器内部网络地址直接访问:
示例启动命令:docker run -d --name pg-service -p 5432:5432 -e POSTGRES_USER=db_admin -e POSTGRES_PASSWORD=strong_pwd -e POSTGRES_DB=core_db postgres:15-alpine - 确认容器内PG服务的监听配置允许外部连接:
postgresql.conf中listen_addresses = '*',不要只绑定容器内的127.0.0.1 - 配置
pg_hba.conf的访问规则,允许宿主机来源的连接请求,通常添加规则:host all all 0.0.0.0/0 scram-sha-256(生产环境可收窄允许的IP段范围) - 不要通过Docker自定义网络的容器名、宿主机网关IP方式建立连接,这类地址会随Docker网络配置变动失效,稳定性极差。
Liquibase 连接参数配置
所有配置都保存在宿主机上Liquibase运行目录下的liquibase.properties文件中,完全独立于Maven项目:
# 连接地址直接用localhost,走宿主机端口映射链路 url=jdbc:postgresql://localhost:5432/core_db?tcpKeepAlive=true&connectTimeout=10 username=db_admin password=strong_pwd driver=org.postgresql.Driver # 指定变更日志路径,路径相对于当前Liquibase运行目录 changeLogFile=./db/changelog/root_changelog.xml
运行验证
直接在宿主机命令行调用Liquibase命令验证连接,完全不经过Maven流程:
- 执行连接测试命令:
liquibase status,如果正常输出版本号、未执行变更数量,说明连通配置生效 - 执行数据库变更命令:
liquibase update
常见坑点规避
- 不要为了图方便把Liquibase的执行绑到Maven的插件生命周期里,否则还是会在项目pom里生成依赖配置,违背零依赖的要求
- 不要把Liquibase的配置文件放到Maven项目的resources目录下,避免被打包到项目制品里,保持配置的独立性
- 生产环境不要用PG的超级管理员账号跑Liquibase,单独创建拥有schema变更权限的最小权限账号即可
内容的提问来源于stack exchange,提问作者Garamoff
相关产品推荐
相关产品推荐

