【问题标题】:Override Spring boot properties in docker container覆盖 docker 容器中的 Spring Boot 属性
【发布时间】: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


【解决方案1】:

我发现我的设置有问题。我犯了一个愚蠢的错误。配置服务器不在我的 docker 网络中,我使用 localhost 与配置服务器通信。本地主机当然意味着我指的是仅运行应用程序的应用程序容器 IP。相反,当我使用机器的 IP 地址或主机名时,我的应用程序容器可以成功连接到配置服务器。

【讨论】:

    【解决方案2】:

    为什么不运行容器 --> 进入容器 --> 更改配置并提交新图像。 之后部署到新环境。

    【讨论】:

    • 这是一个手动步骤,对于 CI/CD 等大多数用例应避免。
    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2020-06-22
    • 2019-03-20
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多