使应用程序配置可编辑的docker图像/容器的最好方法?



我有一个应用程序是这样的dockerized:

FROM openjdk:11-jre-slim as jdkbase
FROM jdkbase
COPY target/dependency-jars /run/dependency-jars
COPY target/resources /run/resources
ADD target/app-1.0.2.jar /run/app-1.0.2.jar
CMD java -jar run/app-1.0.2.jar

这个应用程序使用了application.properties中的一些配置。我将这个docker映像推送到我的私有注册表中,以便在Kubernetes集群中使用它。

没有问题,除非我必须改变application.properties中的任何属性。比如说,我的数据库URL被改变了。所以,我必须在申请中注明日期。属性,然后强制我的应用程序使用更新的配置。我试过编辑申请。属性,然后重新启动容器。因此,在我重新启动容器后,它已经编辑了应用程序。属性,但应用程序仍然使用旧的URL。我发现强制应用程序使用新配置的唯一方法是将更改的容器提交到新映像中,然后启动新映像。

它工作,但对我来说似乎不是一个最佳的解决方案:喜欢,在应用程序的配置每次更改后,我必须重新创建图像,这是+300Mb的数据,我必须将这个新图像推入注册表,我必须从新图像重新创建Kubernetes pod…如果只更改一个URL,似乎会有太多不必要的操作。

那么,有没有其他更优的方式来处理需要改变应用程序。时不时的属性?

如果这是一个spring引导应用程序,则很容易将变量定义为环境变量。如果存在环境变量,则用application.properties中定义的相同名称覆盖该变量。

发生的事情被称为外部化配置,它在这里定义:

Spring Boot允许您外部化您的配置,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用属性文件、YAML文件、环境变量和命令行参数来具体化配置。可以使用@Value注释将属性值直接注入到bean中,通过Spring的环境抽象进行访问,或者通过@ConfigurationProperties绑定到结构化对象。Spring Boot使用一个非常特殊的PropertySource顺序,旨在允许合理的值重写。属性按以下顺序考虑:

  • Devtools在主目录下的全局设置属性(~/.spring-boot- Devtools。
  • 测试中的@TestPropertySource注释
  • @SpringBootTest#properties注释属性。
  • 命令行参数
  • SPRING_APPLICATION_JSON中的属性(嵌入在环境变量或系统属性中的内联JSON)
  • ServletConfig初始化参数。
  • ServletContext初始化参数
  • java:comp/env.
  • JNDI属性
  • Java系统属性(System. getproperties ()).
  • 操作系统环境变量。
  • RandomValuePropertySource只具有随机属性。*.
  • 包中的jar (application-{profile})之外的特定于配置文件的应用程序属性。属性和YAML变量)
  • 打包在jar中的特定于配置文件的应用程序属性(application-{profile})。属性和YAML变量)
  • 打包的jar(应用程序)之外的应用程序属性。
  • 打包在jar(应用程序)中的应用程序属性。
  • @PropertySource注释在你的@Configuration类。默认属性(使用SpringApplication.setDefaultProperties指定)。

所以你可以在运行时传递一个环境变量给你的docker来解决这个问题。你不需要每次都重新创建Docker镜像。

最新更新