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