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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:27:01