为 docker 外部化 spring 数据源属性

externalize spring datasource properties for docker

我希望能够覆盖

spring.datasource.url
spring.datasource.user
spring.datasource.password 

在每个应用程序上开始使用环境变量;

那是因为我正在尝试 docker 化应用程序和数据库。 我想在 .env 文件中指定 url, user, password(对于 docker-compose) 并与应用程序容器(连接到数据库)和数据库容器(能够连接)共享它们。

我试过了

export SPRING_DATASOURCE_URL=${url}
export SPRING_DATASOURCE_USER=${user}
export SPRING_DATASOURCE_PASSWORD=${password}
./mvnw spring-boot:run

但它似乎只获取最后一个参数(在本例中为密码)

我也试过了

./mvnw spring-boot:run \
  -Dspring.datasource.url=${url} \
  -Dspring.datasource.user=${user} \
  -Dspring.datasource.password=${passwrod} \

但是这个似乎只关心第一个(url 在这种情况下)。

我真的很想知道是否有任何可行的方法可以实现 通过终端还是我实际上每次都必须覆盖属性文件?

更新

确实是我的问题。 是 spring.datasource. username,不是 user。真的很抱歉浪费时间。

您的任何值是否可能包含 space 或其他 shell 破坏字符?报价是你的朋友


更基本的 java -jar target/project.jar -Dspring.datasource.url=... 有什么不同吗?

export SPRING_DATASOURCE_URL ... 变体上,你能正确地 echo $SPRING_DATASOURCE_URL 并取回预期值吗?对于所有环境变量?

如果您使用像 XXXYYY 这样的简单值而不是实际值,会有什么不同吗?

正在尝试区分机制和数据...


${url}${user}${password}(或 ${passwrod} 甚至)是文字(例如:env 变量本身)还是为了简洁而在此处省略?

您正在使用 maven 来执行 spring 引导应用程序,这至少是您的一些问题的原因。

当您在使用 Maven 时指定 -D 参数时,它会将系统参数传递给 Maven,而不是您的 spring 应用程序。如果您阅读 https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-system-properties.html 它表明您需要使用语法

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dproperty1=overridden"

简单的答案是不要使用 maven 来执行您的 spring 启动应用程序。生成一个 jar 并使用 java -jar

执行它

刚刚有一个错字。是 spring.datasource. username,而不是 user(或 SPRING_DATASOURCE_USERNAME)。真的很抱歉浪费时间。