【问题标题】:Spring application properties (map) from docker environment来自 docker 环境的 Spring 应用程序属性(映射)
【发布时间】:2021-03-11 08:10:47
【问题描述】:

我想使用 Docker 环境配置我的 dockerized spring boot 应用程序。该属性是一个地图,我在 application.yml 中配置它,如下所示。

spring:
  kafka:
    producer:
      properties:
        "schema.registry.url": http://schema-registry.com:8081

我尝试了以下方法,但没有成功,

environment:
  - SPRING_KAFKA_PRODUCER_PROPERTIES_SCHEMA.REGISTRY.URL=http://schema-registry.com:8081

如何在 docker 环境中配置这个 schema.registry.url 参数?

【问题讨论】:

  • 你可以试试用下划线(_)代替点(.)吗?

标签: spring spring-boot docker spring-kafka


【解决方案1】:

嗯,首先,我需要更多关于您如何使用该容器化应用程序的信息:您是否使用docker-compose 部署它?它是 Docker Swarm 的一部分吗?

根据这一点,可能的解决方案可能会有所不同。

码头工人群

例如,如果您使用 Docker Swarm,您可以将您的 application.yml 定义为模板:

application.yml.template

spring:
  kafka:
    producer:
      properties:
        "schema.registry.url": {{ env "schema_registry" }}

然后,您将不得不解析该模板。为此,我假设您已在容器中的 /usr/app 下找到了 Spring Boot 可执行 JAR,并且您的映像名为 springboot-app

docker-compose.yml

version: "3.8"
services:
  springboot-app:
    image: springboot-app:latest
    environment:
      SPRING_KAFKA_PRODUCER_PROPERTIES_SCHEMA.REGISTRY.URL: 'http://schema-registry.com:8081'
    configs:
      - source: springboot-app.application.yml
        target: /usr/app/config/application.yaml
        mode: 0440

configs:
  springboot-app.application.yml:
    template_driver: golang
    file: ./application.yml.template

所以您现在可以使用 docker stack deploy -c docker-compose.yml springboot-app 部署您的 Swarm。

或者更好的是,如果您在生产环境中工作,您可以将环境变量与通用配置分开:

docker-compose.yml

version: "3.8"
services:
  springboot-app:
    image: springboot-app:latest
    configs:
      - source: springboot-app.application.yml
        target: /usr/app/config/application.yaml
        mode: 0440

configs:
  springboot-app.application.yml:
    template_driver: golang
    file: ./application.yml.template

docker-compose.dev.yml

version: "3.8"
services:
  springboot-app:
    environment:
      SPRING_KAFKA_PRODUCER_PROPERTIES_SCHEMA.REGISTRY.URL: 'http://schema-registry.com:8081'

并将其部署为docker stack deploy -c docker-compose.yml -c docker-compose.dev.yml springboot-app

Docker 编写

由于您在最近的评论中提到您正在使用docker-compose,因此使用方式不一样。

首先,并非 Spring 中的所有属性都可以在 Docker Compose 文件中被覆盖,只有那些您可以在构建或启动应用程序时传递给 Maven 的属性。

此外,您似乎错误地定义了 environment 属性,因为通常您提供的所有属性都应该更改点 '.'通过下划线'_',但无论如何,由于通常 Kafka Producer 的配置不仅仅是定义一个 URL,我会使用 Spring 的配置文件功能。

您可以使用所需的配置组合创建多个配置文件,并通过 Compose 通知 Spring 您要使用哪一个。让我们看一个例子。

application.yml

spring:
  config:
    activate:
      on-profile: "development"
  kafka:
    producer:
      properties:
        "schema.registry.url": https://kafka-dev-endpoint.com
---
spring:
  config:
    activate:
      on-profile: "production"
  kafka:
    producer:
      properties:
        "schema.registry.url": https://kafka-prod-endpoint.com

最后是:

docker-compose.yml

environment:
  - SPRING_PROFILES_ACTIVE=development

如果您想进一步检查,您可以在此处获得更多信息:https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-set-active-spring-profiles

【讨论】:

  • 我使用docker-compose up 部署我的容器。我的基础架构中没有 swarm 或 kubernetes。
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 2018-11-22
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 2017-04-22
相关资源
最近更新 更多