Spring 来自 docker 环境的应用程序属性(地图)

Spring application properties (map) from docker environment

我想使用 Docker 环境配置我的 docker 化 spring 启动应用程序。 属性 是一张地图,我在 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 参数?

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

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

Docker群

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

application.yml.template

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

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

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 的属性.

此外,您似乎错误地定义了环境 属性,因为通常您提供的所有环境都应该更改点“.”。通过下划线'_',但无论如何,由于通常 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