0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Helmチャートで .Files を使い、ArgoCDと連携しようとして詰んだ話

Last updated at Posted at 2025-07-12

本記事の概要

Helmチャートでコンフィグファイルや環境変数を設定するのに {{ .Files.Get <path/to/file> }} が便利そうだったので使ってみましたが、ArgoCDのApplicationリソースからその内容を変更できないことがわかりました。

本記事では .Files を導入してArgoCDと連携する際に生じる問題と、その問題をどのようにすれば解決できるのかを解説します。

要約

helm install -f--set で動的に変更が必要な箇所に .Files は使うな! values を使うべし!

※ この格言(?)は、公式ドキュメントの説明に基づいています。

.Files、 便利!

例えば以下のようなコンフィグファイルがあるとします。

files/sample.conf
# Sample application config
[server]
host = 0.0.0.0
port = 8080

[database]
user = admin
password = secret

これをHelmチャートを使ってKubernetesのConfigMapリソースに書きたい場合、次のように .Files.Get が使えます。

templates/configmap.yaml
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の内容です。nameversion はこれ以外の値でも問題ないです。

Chart.yaml
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リソースのマニフェストを書いていきます。

mychart.app.yaml
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は次のように書きます。

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 を参照するようにします。

templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-conf
data:
  sample.conf: |-
{{- .Values.sampleConf | nindent 4 }}

このような書き方にすれば、helm installコマンドを実行する際に sampleConf の値を書き換え可能になります。

例えば、次のようにカスタマイズしたコンフィグファイルを用意します。

files/customize.conf
# 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 を使うべし!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?