テンプレート内でのファイルアクセス

前のセクションでは、名前付きテンプレートを作成してアクセスするいくつかの方法を検討しました。これにより、あるテンプレートから別のテンプレートに簡単にインポートできます。しかし、*テンプレートではないファイル*をインポートし、その内容をテンプレートレンダラーに送信せずに挿入したい場合もあります。

Helmは、`.Files`オブジェクトを介してファイルへのアクセスを提供します。ただし、テンプレートの例に進む前に、このしくみについて注意すべき点がいくつかあります。

  • Helmチャートに余分なファイルを追加しても問題ありません。これらのファイルはバンドルされます。ただし、注意してください。Kubernetesオブジェクトのストレージ制限のため、チャートは1Mより小さくなければなりません。
  • 通常はセキュリティ上の理由から、`.Files`オブジェクトを介してアクセスできないファイルもあります。
    • `templates /`内のファイルにはアクセスできません。
    • `.helmignore`を使用して除外されたファイルにはアクセスできません。
    • 親のファイルを含め、Helmアプリケーションのサブチャート外のファイルにはアクセスできません。
  • チャートはUNIXモード情報を保持しないため、ファイルレベルのアクセス許可は、`.Files`オブジェクトに関してファイルの可用性に影響を与えません。

基本的な例

これらの注意事項を踏まえて、3つのファイルを読み込んでConfigMapに挿入するテンプレートを作成してみましょう。はじめに、3つのファイルをチャートに追加し、3つすべてを`mychart /`ディレクトリ内に直接配置します。

config1.toml:

message = Hello from config 1

config2.toml:

message = This is config 2

config3.toml:

message = Goodbye from config 3

これらはそれぞれ単純なTOMLファイルです(昔ながらのWindows INIファイルを想像してください)。これらのファイルの名前がわかっているので、`range`関数を使用してそれらをループし、それらの内容をConfigMapに挿入できます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $files := .Files }}
  {{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
  {{ . }}: |-
        {{ $files.Get . }}
  {{- end }}

このConfigMapは、前のセクションで説明したいくつかの手法を使用しています。たとえば、`$ files`変数を作成して、`.Files`オブジェクトへの参照を保持します。また、`tuple`関数を使用して、ループするファイルのリストを作成します。次に、各ファイル名(`{{。}}:|-`)と、ファイル`{{ $ files.Get。}}`の内容を出力します。

このテンプレートを実行すると、3つすべてのファイルの内容を含む単一のConfigMapが生成されます。

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: quieting-giraf-configmap
data:
  config1.toml: |-
        message = Hello from config 1

  config2.toml: |-
        message = This is config 2

  config3.toml: |-
        message = Goodbye from config 3

パスヘルパー

ファイルを操作する場合、ファイルパス自体にいくつかの標準操作を実行すると非常に便利です。これを支援するために、HelmはGoの pathパッケージの多くの関数をインポートして使用できるようにします。それらはすべて、Goパッケージと同じ名前でアクセスできますが、最初の文字は小文字です。たとえば、`Base`は`base`などになります。

インポートされた関数は次のとおりです。

  • Base
  • Dir
  • Ext
  • IsAbs
  • Clean

Globパターン

チャートが大きくなるにつれて、ファイルを整理する必要性が高まる可能性があります。そのため、 globパターンの柔軟性を利用して特定のファイルを抽出するのに役立つ`Files.Glob(pattern string)`メソッドを提供します。

`.Glob`は`Files`型を返すため、返されたオブジェクトで`Files`メソッドを呼び出すことができます。

たとえば、次のディレクトリ構造を想像してください。

foo/:
  foo.txt foo.yaml

bar/:
  bar.go bar.conf baz.yaml

Globには複数のオプションがあります。

{{ $currentScope := .}}
{{ range $path, $_ :=  .Files.Glob  "**.yaml" }}
    {{- with $currentScope}}
        {{ .Files.Get $path }}
    {{- end }}
{{ end }}

または

{{ range $path, $_ :=  .Files.Glob  "**.yaml" }}
      {{ $.Files.Get $path }}
{{ end }}

ConfigMapとSecretsユーティリティ関数

(Helm 2.0.2以降で利用可能)

実行時にポッドにマウントするために、ファイルの内容をConfigMapとSecretsの両方に配置するのが一般的です。これを支援するために、`Files`タイプにいくつかのユーティリティメソッドを提供します。

さらに整理するために、これらのメソッドを`Glob`メソッドと組み合わせて使用​​すると特に便利です。

上記の Glob例のディレクトリ構造を考えると

apiVersion: v1
kind: ConfigMap
metadata:
  name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
  name: very-secret
type: Opaque
data:
{{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}

エンコーディング

ファイル 가져와서 템플릿에서 base-64 인코딩하여 전송 성공을 보장할 수 있습니다.

apiVersion: v1
kind: Secret
metadata:
  name: {{ .Release.Name }}-secret
type: Opaque
data:
  token: |-
        {{ .Files.Get "config1.toml" | b64enc }}

上記は、以前に使用したのと同じ`config1.toml`ファイルを取得してエンコードします。

# Source: mychart/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: lucky-turkey-secret
type: Opaque
data:
  token: |-
        bWVzc2FnZSA9IEhlbGxvIGZyb20gY29uZmlnIDEK

テンプレート内のファイルの各行にアクセスしたい場合があります。このために便利な`Lines`メソッドを提供します。

`range`関数を使用して`Lines`をループできます。

data:
  some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
    {{ . }}{{ end }}

`helm install`中にチャートの外部ファイルを渡す方法はありません。したがって、ユーザーにデータの提供を求める場合は、`helm install -f`または`helm install --set`を使用してロードする必要があります。

この議論は、Helmテンプレートを作成するためのツールとテクニックについての探求を締めくくります。次のセクションでは、特別なファイル`templates / NOTES.txt`を使用して、チャートのユーザーにインストール後の指示を送信する方法を説明します。