代码之家  ›  专栏  ›  技术社区  ›  x__dos

Spring Boot:重写Kubernetes ConfigMap中的application.yml属性

  •  0
  • x__dos  · 技术社区  · 5 年前

    0 回复  |  直到 5 年前
        1
  •  1
  •   AndD Jalitha Kalsara    5 年前

    Spring引导应用程序应该用环境变量覆盖配置文件中的属性(大多数情况下是在application.yml中)。

    apiVersion: v1
    kind: Pod
    metadata:
      name: example
    spec:
      containers:
      - name: example-container
        image: example-image:latest
        env:
        - name: THIS_IS_AN_ENV_VARIABLE
          value: "Hello from the environment"
        - name: spring.persistence.url
          value: "The persistence url, for example"
    

    更好的是,您可以将ConfigMap的所有内容作为环境变量注入:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: example-config
    data:
      spring.persistence.url: "your persistence url"
      spring.mail.user: "your mail user"
    

    然后你的吊舱:

    apiVersion: v1
    kind: Pod
    metadata:
      name: example
    spec:
      containers:
      - name: example-container
        image: example-image:latest
        envFrom:
        - configMapRef:
            name: example-config
    

    在容器内,变量将在环境中。。Spring应该使用它们来重写在application.yml中定义(甚至可能没有定义)的同名变量

    更多信息:

    https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/ https://docs.spring.io/spring-boot/docs/1.3.3.RELEASE/reference/html/boot-features-external-config.html

        2
  •  0
  •   Manuel    5 年前

    我们不得不做类似的事情。我向你解释我们是怎么做到的。可能这有帮助。

    它可以包含以下内容:

    #!/bin/bash
    set -e
    
    # Source custom scripts, if any
    if [ -d /etc/spring.d ]; then
        for f in /etc/spring.d/*; do
            if [ -x "$f" ]; then
                echo "Running $f ..." >&2
                "$f"
            else
                echo "Could not run $f, because it's missing execute permission (+x)." >&2
            fi
        done
        unset f
    fi
    
    exec "$@"
    

    内部 /etc/弹簧d spring启动jar文件

    你的Dockerfile看起来像

    FROM adoptopenjdk:15-jre
    RUN mkdir /app
    COPY application.jar /app/
    COPY entrypoint.sh /entrypoint.sh
    ENTRYPOINT ["/entrypoint.sh"]
    CMD ["java", "-jar", "/app/application.jar"]
    

    复制脚本 并将其装载到目录中

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: spring-d
    data:
      copy-yaml.sh: |
        #!/bin/bash
        cp /config/application.yml /app/application.yml
    

    复制脚本将注意将application.yaml(也将作为configMap装载)复制到正确的位置。

    以及进一步的application.yml配置图

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: app-yaml
    data:
      application.yml: |
        spring:
          application:
            name: This is just an example, add as many values as you want.
    

    豆荚

    ...
        volumeMounts:
        - name: spring-d
          mountPath: /etc/spring.d
        - name: app-yaml
          mountPath: /config
      - name: spring-d
        configMap:
          name: spring-d
          defaultMode: 0777
      - name: app-yaml
        configMap:
          name: app-yaml
    ...
    

    这段代码目前还没有经过测试,它只是向您展示了一个如何以非常灵活的方式解决问题的示例。

        3
  •  0
  •   Manuel    5 年前

    从另一个角度来说是可行的,这就是为什么我要再次回答。 用简单的方法做。

    文件 spring boot (external application properties) 说:

    当应用程序启动时,Spring Boot将自动从以下位置查找并加载application.properties和application.yaml文件:

    类路径根

    classpath/config包

    当前目录中的/config子目录

    也就是说我们不需要做任何设置。它应该在子目录config中找到config。

    apiVersion: v1
    kind: ConfigMap
    metadata:
    name: spring-application-config
    data:
      application.yml: |
        spring:
          application:
            name: This is just an example, add as many values as you want.
    

    ...
        volumeMounts:
        - name: spring-application-config
          mountPath: /app/config
      - name: spring-application-config
        configMap:
          name: spring-application-config
    ...
    

    假设spring引导jar文件位于 /应用程序