繁体   English   中英

覆盖 docker 容器中的 Spring 启动属性

[英]Override Spring boot properties in docker container

我有一个 dockerized 的 Spring Boot 应用程序。 默认情况下,应用程序具有spring.cloud.config.enabled=false因此应用程序不会从 configserver 中获取 application.properties。 但是,在单独的 env 中部署时,我们需要将应用程序与 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。

让我知道问题是什么。

更新:我不能使用配置文件,因为我们公司的环境太多了,甚至虚拟机也在不断变化,所以不能有硬编码的配置文件。 我们想要一个解决方案,我们可以只从外部传递某些变量。

正如有人在评论中指出的那样,上述 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 网络中,我使用 localhost 与配置服务器进行通信。 本地主机当然意味着我指的是仅运行应用程序的应用程序容器 IP。 相反,当我使用机器的 ip 地址或主机名时,我的应用程序容器可以成功连接到配置服务器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM