Spring Boot中如何在application.yml中配置Liquibase变量
解决方案
方案1:Liquibase 参数注入(无需调整部署架构)
1.1 调整 application.yml 配置
新增Liquibase参数配置,将Spring环境中的密码值传递给Liquibase上下文:
spring: liquibase: enabled: true user: root password: root # 新增parameters配置,传递自定义参数到Liquibase变更脚本 parameters: app-db-password: ${spring.datasource.password} datasource: url: "jdbc:mysql://localhost:3306/db" username: consumer_app password: password
1.2 修改Liquibase变更集
直接使用Liquibase上下文传递的参数,Liquibase会在执行SQL前自动替换参数值:
<changeSet id="2021-12-02 12:00:01" author="author" dbms="mysql"> <sql> CREATE USER consumer_app IDENTIFIED BY '${app-db-password}'; </sql> <rollback> DROP USER IF EXISTS consumer_app; </rollback> </changeSet>
原方案失效原因:Liquibase默认不会直接解析Spring上下文的配置属性,你在SQL中写的
${spring.datasource.password}没有被处理,直接作为字符串传入MySQL执行,因此密码被设为变量名本身。
方案2:Docker初始化脚本(适配容器化部署场景)
适合后续通过docker-compose管理变量的场景,无需修改应用代码和Liquibase配置。
2.1 编写数据库初始化脚本
在项目中新增init.sh文件,放在docker构建上下文目录中:
#!/bin/bash set -e mysql -u root -p"${MYSQL_ROOT_PASSWORD}" <<EOF CREATE USER IF NOT EXISTS consumer_app@'%' IDENTIFIED BY '${DB_APP_PASSWORD}'; GRANT ALL PRIVILEGES ON ${MYSQL_DATABASE}.* TO consumer_app@'%'; FLUSH PRIVILEGES; EOF
给脚本添加执行权限:chmod +x init.sh
2.2 调整docker-compose配置
在docker-compose.yml中挂载初始化脚本到MySQL容器的自动执行目录,统一配置密码变量:
services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: db DB_APP_PASSWORD: ${DB_APP_PASSWORD} # 可从宿主机环境变量或.env文件读取 volumes: - ./init.sh:/docker-entrypoint-initdb.d/init.sh ports: - "3306:3306" spring-app: build: . environment: SPRING_DATASOURCE_PASSWORD: ${DB_APP_PASSWORD} # 其他应用配置省略
启动时只需在docker-compose运行环境中设置DB_APP_PASSWORD变量即可完成多环境适配。
内容的提问来源于stack exchange,提问作者Aleksei
相关产品推荐
相关产品推荐

