Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

968
Views
Spring Boot: invalidar las propiedades application.yml de Kubernetes ConfigMap

Necesito reemplazar algunas de las propiedades definidas en una aplicación.yml de la aplicación Spring Boot que se ejecuta en k8s. ¿Cómo puedo hacer esto? La única forma que encontré es montar application.yml completo, pero solo necesito anular una propiedad.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Las aplicaciones Spring Boot deben anular las propiedades en los archivos de configuración (también conocido como application.yml la mayoría de las veces) con variables de entorno.

Suponiendo que la aplicación se implementa en Kubernetes con un pod (pero no importa, las implementaciones, los StatefulSets, los trabajos son todos iguales en cuanto al entorno), puede inyectar variables de entorno dentro del contenedor asignándolas directamente a la implementación en sí, o con un ConfigMap (o un secreto, en caso de que la propiedad sea más segura y enmascarada)

 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"

Aún mejor, puede inyectar todo el contenido de un ConfigMap como variables de entorno:

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

Y luego tu Pod:

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

Dentro del contenedor, las variables estarán en el entorno... y Spring debería usarlas para anular las variables con el mismo nombre que están definidas (o tal vez ni siquiera definidas) en su application.yml

Para más información:

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

over 4 years ago · Santiago Trujillo Report

0

Podría ser factible de otra manera, por eso estoy respondiendo de nuevo. Hazlo de una manera fácil.

Cree su application.yml en un mapa de configuración y móntelo como un subdirectorio llamado config en el mismo directorio donde se encuentra el contenedor de arranque Spring.

La documentación de Spring Boot (propiedades de la aplicación externa) dice:

Spring Boot buscará y cargará automáticamente los archivos application.properties y application.yaml desde las siguientes ubicaciones cuando se inicie su aplicación:

La raíz del classpath

El paquete classpath /config

El directorio actual

El subdirectorio /config en el directorio actual

Directorios secundarios inmediatos del subdirectorio /config

Lo que significa que no tenemos que ocuparnos de configurar nada. Debería encontrar la configuración dentro del subdirectorio 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.

pod.yaml:

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

Suponiendo que su archivo jar de arranque de primavera se encuentra en la ruta / aplicación

over 4 years ago · Santiago Trujillo Report

0

Tuvimos que hacer algo similar. Y te explico cómo lo hicimos. Posiblemente esto ayude.

Si puede modificar su Dockerfile, cree un script entrypoint.sh. Podría contener lo siguiente:

punto de entrada.sh

 #!/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 "$@"

El entrypoint.sh está ejecutando scripts personalizados dentro del directorio /etc/spring.d al inicio. Puedes poner cualquier script ejecutable dentro, lo que quieras.

Dentro de /etc/spring.d puede crear un script de copia que copie una aplicación.yml en el mismo directorio donde se encuentra el archivo jar de arranque de Spring . El ejemplo sigue.

Su Dockerfile podría verse como

 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"]

Si está preparado, puede usar un configMap para definir el script de copia y montarlo en el directorio /etc/spring.d

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

El script de copia se encargará de que application.yaml (que también se montará como configMap) se copie en el lugar correcto.

Y otro mapa de configuración para su aplicación.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.

Dentro de tu pod yaml podrías hacer algo como esto:

 ... 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 ...

ESTE CÓDIGO NO ESTÁ PROBADO ACTUALMENTE, SÓLO ESTÁ MOSTRANDO UN EJEMPLO DE CÓMO PUEDE RESOLVER SU PROBLEMA DE UNA MANERA MUY FLEXIBLE.

Usé fragmentos de mis guiones y los copié aquí juntos, por lo que tal vez podría haber pequeños errores en el interior. Por favor hagamelo saber.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!