【发布时间】:2020-12-23 08:30:45
【问题描述】:
我有一个 dockerized 的 Spring Boot 应用程序。默认情况下,应用程序具有spring.cloud.config.enabled=false,因此应用程序不会从 configserver 获取 application.properties。但是,在单独的环境中部署时,我们需要将应用程序与 configserver 集成,因此我们需要覆盖并将 spring.cloud.config.enabled 属性设置为 true。
为了实现这一点,我正在使用以下 docker-compose 文件运行 docker 映像:
version: '3'
services:
my-app-new:
container_name: my-app
image: my-app:1.0.0-SNAPSHOT
ports:
- "8070:8070"
environment:
- SPRING_CLOUD_CONFIG_ENABLED=true
- SPRING_CLOUD_CONFIG_URI=http://localhost:14180
但是,它只是不起作用。如果我对属性文件中的值进行硬编码,那么它可以很好地集成。
我也试过下面的命令,但还是不行:
docker run -p 8070:8070 -e SPRING_CLOUD_CONFIG_ENABLED=true -e SPRING_CLOUD_CONFIG_URI=http://localhost:14180 my-app:1.0.0-SNAPSHOT
spring boot 版本是2.2.6。
让我知道问题所在。
更新: 我不能使用配置文件,因为我们公司的环境太多,甚至虚拟机也在不断变化,所以不能有硬编码的配置文件。我们想要一个解决方案,我们可以只从外部传递某些变量。
正如有人在 cmets 中指出的那样,上面的 compose yml 不起作用,因为环境变量需要由 Spring Boot 应用程序读取。在互联网上进行了一些研究,相反,我们现在在运行图像时传递了 JAVA_OPTS tomcat 变量。像这样:
docker run --env JAVA_OPTS="-Dspring.cloud.config.uri=http://localhost:14180 -Dspring.cloud.config.enabled=true" -p 8080:8080 my-app-image
在 docker 文件中,我们在启动 jar 时使用了 JAVA_OPTS
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar" ]
这仍然不起作用。不知道出了什么问题。
【问题讨论】:
-
您在 Docker 环境中设置这些变量。您需要从 Spring Boot 应用程序的环境中读取这些值。一旦应用程序启动,我相信这个属性不能改变。检查这个stackoverflow.com/questions/35531661/…
-
我的理解是无论环境变量如何,都会读取 application.properties。环境变量只覆盖了它们。我的情况是你需要使用个人资料。假设你有 application-cloud.properties。环境变量 SPRING_PROFILES_ACTIVE=cloud
-
请检查我更新的问题。我们不能有配置文件,我们想要一个解决方案,我们可以在启动应用程序时传递某些属性,就像从命令启动 spring boot 应用程序 jar 时一样。
-
您是否已将配置设置为使用环境变量
spring.cloud.config.enabled = ${SPRING_CLOUD_CONFIG_ENABLED}? -
@ŠimonKocúrek:请您检查问题的更新部分。
标签: java spring-boot docker