背景#

我们的Spring Boot在Kubernetes环境中运行,配置文件application.yaml中包含了一些环境变量占位符,例如${DB_HOST}${DB_PORT}等。这些变量需要在应用启动前被替换为实际的值。

但这样的配置文件无法直接被Spring Boot识别,在本地需要开发或者调试的时候,我们希望能够将这些环境变量替换为实际的值,从而生成一个完整的application.yaml文件。

解决方案#

envsubst是一个命令行工具,可以将输入中的环境变量替换为其实际值。

步骤#

在ubuntu中安装envsubst:

sudo apt update
sudo apt install gettext-base

原先的application.yaml文件内容如下:

app:
  version: "@project.version@"
  payment-api-key: ${PAYMENT_API_KEY}
  payment-secret-key: ${PAYMENT_SECRET_KEY}
  payment-endpoint: ${PAYMENT_MS_INTERNAL_URL}
  site-db-name: ${SITE_DB_NAME}

该文件会在应用的jar文件中

mkdir extracted_folder
cd extracted_folder
jar xf ../app.jar

Then can find the application.yaml file under BOOT-INF/classes/ folder.

root@service-578fdcb4b4-szpl5:/app/extracted_folder/BOOT-INF/classes# ls -trl
total 24
-rw-r--r--. 1 root root 4045 Nov 13 02:22 logback-spring.xml
-rw-r--r--. 1 root root 1151 Nov 13 02:22 git.properties
-rw-r--r--. 1 root root 7533 Nov 13 02:22 application.yaml
drwxr-xr-x. 3 root root   22 Nov 13 02:22 com

然后使用envsubst命令替换环境变量:

envsubst < application.yaml > application-resolved.yaml

此时,application-resolved.yaml文件中的环境变量占位符已经被替换为实际的值。

将文件取出到本地

kubectl cp <pod_name>:/app/extracted_folder/BOOT-INF/classes/application-resolved.yaml ./application-resolved.yaml