本記事の概要
Helmチャートでコンフィグファイルや環境変数を設定するのに {{ .Files.Get <path/to/file> }}
が便利そうだったので使ってみましたが、ArgoCDのApplicationリソースからその内容を変更できないことがわかりました。
本記事では .Files
を導入してArgoCDと連携する際に生じる問題と、その問題をどのようにすれば解決できるのかを解説します。
要約
helm install -f
や --set
で動的に変更が必要な箇所に .Files
は使うな! values
を使うべし!
※ この格言(?)は、公式ドキュメントの説明に基づいています。
.Files
、 便利!
例えば以下のようなコンフィグファイルがあるとします。
# Sample application config
[server]
host = 0.0.0.0
port = 8080
[database]
user = admin
password = secret
これをHelmチャートを使ってKubernetesのConfigMapリソースに書きたい場合、次のように .Files.Get
が使えます。
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-conf
data:
sample.conf: |-
{{- .Files.Get "files/sample.conf" | nindent 4 }}
ちなみにディレクトリ構成は以下です。
.
├── Chart.yaml
├── files
│ └── sample.conf
└── templates
└── configmap.yaml
以下はChart.yamlの内容です。name
や version
はこれ以外の値でも問題ないです。
apiVersion: v2
name: mychart
version: 0.1.0
試しに helm template .
を実行して、Kubernetesマニフェストがどのようにレンダリングされるかを見てみましょう。
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-conf
data:
sample.conf: |-
# Sample application config
[server]
host = 0.0.0.0
port = 8080
[database]
user = admin
password = secret
想定通り、sample.conf
のキーに files/sample.conf
の内容が値として格納されていますね。実際に使うファイルを用意すれば、そのままそのファイルパスを参照してマニフェストに反映できる点が便利です!
このHelmチャートが、あるGitリポジトリに格納されていると想定します。その場合に、ローカル環境にgit clone
で持ってきて、 files/sample.conf
を作成して各環境に応じて編集して、helm install
すれば問題なく使えます。(files/sample.conf
を .gitignore
する配慮は要りますが)
ここまで読むと、「 .Files
いいじゃん!これ使っていこう!」と思えますよね。
ArgoCDと連携できなくないか...?
続いて、このHelmチャートをGitリモートにpushして、ArgoCDのApplicationリソースでGitOps的に使えるようにしてみましょう。早速、Applicationリソースのマニフェストを書いていきます。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: mychart-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/showchan33/mychart.git
targetRevision: main
path: .
helm:
# ??
...
はて、helm
の後にHelmチャートの files/sample.conf
の中身を書きたいのですが、どうやって指定するのでしょうか? 2025/07/12現在、ArgoCDの公式ドキュメントを見ると、次のようにパラメータを指定する例が書かれています。
helm:
valueFiles: # helm install -f と同じ
- values-production.yaml
values: | # helm install --set と同じ
image:
tag: "1.2.3"
replicaCount: "3"
fileParameters: # helm install --set-file と同じ
- name: some.key
path: path/to/file.ext
今回、元のHelmチャートのディレクトリで files/sample.conf
に書いた内容は、上のどれかの方法で適用できそうな感じがしますが...、うーん、どれもしっくり来ません。だいぶ考えてみたけど、やっぱりどれも無理そう...。
なぜ無理かと言うと、上記の設定は全て Helmチャートのvalueにキーと値を設定する ものだからです。今回、files/sample.conf
の内容は .Files
を使ってHelmチャートに渡しており、valueは使っていない、だから無理なのです。
仮に、Helmチャートのディレクトリにファイルを作ったり書き換えたりできる設定値がArgoCDにあればいいのかもしれませんが、そんな都合の良い機能はありません。例えば以下のような設定はできないのです。
helm:
# 【注意!!】以下は架空の設定値で実在しません!!
inlineFiles:
files/sample.conf: |
[server]
host = 0.0.0.0
port = 8081
[database]
user = admin2
password = secret2
ということで、ArgoCDとの連携が前提のHelmチャートで、外部から変更が必要な箇所に .Files
を使うと、詰んでしまうことがわかりました。
解決策:valueを使うべし
files/sample.conf
の内容を表すvalueを定義して、そのvalueを介してHelmチャートに値を渡せば解決します。
以下のように、files/sample.conf
の代わりに values.yaml
を追加したディレクトリ構成にします。
.
├── Chart.yaml
├── templates
│ └── configmap.yaml
└── values.yaml # 追加
values.yaml
は次のように書きます。
sampleConf: |
# Sample application config
[server]
host = 0.0.0.0
port = 8080
[database]
user = admin
password = secret
また、templates/configmap.yaml
は、次のように、values.yaml
で定義した sampleConf
を参照するようにします。
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-conf
data:
sample.conf: |-
{{- .Values.sampleConf | nindent 4 }}
このような書き方にすれば、helm install
コマンドを実行する際に sampleConf
の値を書き換え可能になります。
例えば、次のようにカスタマイズしたコンフィグファイルを用意します。
# Sample application config
[server]
host = 0.0.0.0
port = 8081
[database]
user = admin2
password = secret2
この内容をConfigMapリソースに適用するには、次のように --set-file
のオプションを使います。
helm template . --set-file sampleConf=files/customize.conf
すると、sample.conf
の値がfiles/customize.conf
で書き換わります。
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-conf
data:
sample.conf: |-
# Sample application config
[server]
host = 0.0.0.0
port = 8081
[database]
user = admin2
password = secret2
ArgoCDのApplicationリソースの場合、 --set-file
オプションと同じ設定を次のように fileParameters
記述できます。
helm:
fileParameters: # helm install --set-file と同じ
- name: sampleConf
path: files/customize.conf
これで問題解決です!
おわりに
最後にもう一度いいます。
helm install -f
や --set
で動的に変更が必要な箇所に .Files
は使うな! values
を使うべし!