application.yaml を実行時に上書きする

公式ドキュメントをよく読めば書いてあることですが、しばしば分からなくなるので備忘録としてまとめておきます。

やりたいこと

ファイル 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 を実行時に上書きする"

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です