公式ドキュメントをよく読めば書いてあることですが、しばしば分からなくなるので備忘録としてまとめておきます。
やりたいこと
ファイル application.yaml あるいは application.properties は Spring Boot をコンテナ化するときに静的に入れ込みますが、実行時に一部の値を変えたいことがあります。いくつかやり方がありますが、ここでは環境変数を使った方法を検討します。
ConfigMap の用意
これを実現するには、kubernetes の機能である、ConfigMap を使用します。まず、replace.yaml を定義します。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: default
name: alt-config
data:
MY_PROPERTY=new_property
プロパティのキーが環境変数準拠になっていることに注意してください。
kubectl create configmap -f ./replace.yaml
とすると、”alt-properties” という名前の Config Map が作成されます。
> kubectl get configmaps
NAME DATA AGE
alt-config 1 14h
pod.yaml の修正
作成した Config Map を pod.yaml に取り込みます。
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: sample-app
name: sample-app
spec:
containers:
- image: sample-app
name: sample-app
imagePullPolicy: Never
command: ["java","-jar","/app/app.jar"]
envFrom:
- configMapRef:
name: alt-config
dnsPolicy: ClusterFirst
restartPolicy: Never
status: {}
行 envFrom から3行が今回追加した内容となります。Pod を起動します。
kubectl create -f ./pod.yaml
Spring Boot に定義プロパティ出力ロジックを入れておくと、以下のようなログが出ます。
2024-06-06 16:23:48 myProperty: new_property
構造の置き換え
リスト、マップと言った構造を持つプロパティを置き換えるには、引数の直前にアンダースコア(_)を付けます。例えば、
private List<String> my_properies
と定義していた場合、replace.yaml では
apiVersion: v1
kind: ConfigMap
metadata:
namespace: default
name: alt-config
data:
MY_PROPERTIES_0=property0
MY_PROPERTIES_1=property1
とすると my_properties の内容を ConfigMap で置き換えることができます。
2024-06-06 16:30:06 myProperties: [property0, property1]
構造を持っているプロパティを YAML で置き換えられるか?
ConfigMap の公式ドキュメントによると、現時点 (2024/6/9) では残念ながら直接 YAML で書き換えられないようです。ConfigMap を /config にマウントして自分で置き換えるか、上記の環境変数を通した置き換えをするしかありません。
1 throughts on "application.yaml を実行時に上書きする"