【发布时间】:2020-07-30 23:26:33
【问题描述】:
我正在尝试使用 Spring Boot 2.2.4 版运行 java8 应用程序。然后将该应用程序打包在一个 docker 映像中。
我在 Dockerfile 中指定的运行我的应用程序的方式是这样的:
FROM openjdk:8
.....
CMD /usr/local/openjdk-8/bin/java -jar -Dspring.config.location=/opt/$APP/ /opt/$APP/$APP.jar
我遇到的问题是加载外部属性文件。 例如,我有与此类似的 application.properties 文件,它打包在 JAR 中:
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=db1
application.queue.sqs.queue_name=somesqs
此外,我还向 docker 映像注入了一个位于 /opt/myapp/ 的附加文件 application.properties。此外部文件与此类似:
spring.data.mongodb.uri=mongodb://username:password@MONGO_URL:27017/db_name
application.queue.sqs.queue_name=another_sqs
预期行为:应用程序将加载新的another_sqs 位置和外部 mongo 连接。
但是,实际行为:阅读日志时,我可以看到新的 sqs url(即 another_sqs)已正确加载,尽管 mongo 连接的新值被丢弃,因此使用本地嵌入式 mongo 引擎。
我查阅了有关 stackoverflow 的以下帖子,以尝试了解我所遇到的情况:
但据我了解,当使用 spring 2.X 及更高版本时,-Dspring.config.location 应该覆盖所有其他属性文件。
这是我开始调试的地方:
尝试 1:我附加到 docker 容器中,cd 到 /opt/$APP/ 我的 app.jar 和 application.properties 所在的位置,执行以下命令 java -jar app.jar 和 viola - 它有效 !建立与外部 mongo 源的连接。这可以通过 spring 的 docs 中指定的 spring 加载属性文件的优先级来解释。
尝试 2:附加容器,cd 进入 $HOME/,执行 java -jar /opt/$APP/app.jar -Dspring.config.location=/opt/$APP/ - 不要连接到外部 mongo,但会连接到 another_sqs。奇怪的事情 - 只加载了 application.properties 值的一部分?这不就是 spring 1.X 通过从多个文件中添加价值的方式吗?
尝试 3:附加容器,cd 到 $HOME/,执行 java -jar /opt/$APP/app.jar -Dspring.config.location=file:/opt/$APP/applicartion.properties - 相同的行为。
尝试 4:编辑 Dockerfile 以包含以下执行:
CMD usr/local/openjdk-8/bin/java -jar -Dspring.config.location=classpath:/application.properties,file:/opt/$APP/application.properties /opt/$APP/$APP-$VER.jar
而且它又可以工作了。 another_sqs 和外部 mongo 都在“Try 4”上正确加载。
因此我的问题是:
为什么要明确指定classpath:/application.proeprties? -Dspring.config.location=/opt/$APP/ 或 -Dspring.config.location=file:/opt/$APP/application.properties 不就够了吗?
【问题讨论】:
-
您尝试了我的答案的解决方案吗?你找到其他解决方案了吗?
-
@robertobatts - 您的解决方案似乎有效,但我想对我在帖子中描述的行为进行更全面的解释。
-
其实没有别的解释,因为Spring就是这样工作的。我用 Spring 文档中的引号更新了我的答案
标签: java spring spring-boot docker