【问题标题】:externalize spring datasource properties for docker为 docker 外部化 spring 数据源属性
【发布时间】:2019-11-12 17:11:54
【问题描述】:

我希望能够覆盖

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

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

那是因为我正在尝试 dockerize 应用程序和数据库。 我想在 .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。真的很抱歉浪费时间。

【问题讨论】:

  • 听起来你做错了什么,因为我使用了这两种方法并且它们都可以正常工作。
  • @Deadron 总而言之,我花了 3 个小时试图找出到底是什么问题。您是否尝试从 application.yml 中删除所有三个属性?因为如果我留下其中的 2 个并将第三个作为参数传递,它工作正常

标签: java spring-boot datasource


【解决方案1】:

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

当您在使用 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 boot 应用程序。生成一个 jar 并使用 java -jar 执行它

【讨论】:

  • 这样我得到了同样的结果。 Hibernate 正在尝试验证“artemvrby”(这是我的本地用户)而不是我指定的数据源用户
  • 这听起来像是与你的 shell 的交互。 maven、hibernate 或 spring 中没有任何东西会知道如何检索您的本地用户名。
【解决方案2】:

您的任何值是否可能包含空格或其他破坏外壳的字符?行情在这里是你的朋友


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

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

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

试图区分机制和数据...


${url}${user}${password}(或 ${passwrod} 偶数)是文字(例如:环境变量本身)还是为了简洁而省略了?

【讨论】:

  • 不,都是单字(除了 url,它是 jdbc:post....,但是 url 可以正常工作)
  • 我注意到它只设置用户失败。如果我没有在 application.yml 中指定,Hibernate 正在尝试验证我的本地 mac 用户,而不是 spring.datasource.user。密码和网址都可以
  • ${url}、${user} 和 ${password} 在这里为简洁起见
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2017-10-22
    • 2015-11-06
    • 2021-05-17
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多