Перейти до основного вмісту
Версія: 3.22.0

Доступ до файлів всередині шаблонів

У попередньому розділі ми розглянули кілька способів створення та доступу до іменованих шаблонів. Це полегшує імпорт одного шаблону в інший шаблон. Але іноді корисно імплементувати файл, який не є шаблоном і вбудувати його вміст без використання рендерера шаблонів.

Helm надає доступ до файлів через обʼєкт .Files. Перш ніж переходити до прикладів шаблонів, є кілька моментів, які слід врахувати:

  • Можна додавати додаткові файли до вашого Helm чарту. Ці файли будуть упаковані. Але будьте обережні. Чарти мають бути меншими за 1М через обмеження зберігання обʼєктів Kubernetes.
  • Деякі файли не можна отримати через обʼєкт .Files, зазвичай з міркувань безпеки.
    • Файли в templates/ не можна отримати.
    • Файли, виключені за допомогою .helmignore, не можна отримати.
    • Файли поза Helm-застосукном subchart, включаючи файли батьківського чарту, не можна отримати.
  • Чарти не зберігають інформацію про режим UNIX, тому дозволи на рівні файлу не вплинуть на доступність файлу в обʼєкті .Files.

Базовий приклад​

З урахуванням цих застережень, напишемо шаблон, який читає три файли в наш ConfigMap. Для початку додамо три файли до чарту, розміщуючи всі три безпосередньо в теці mychart/.

config1.toml:

message = "Hello from config 1"

config2.toml:

message = "This is config 2"

config3.toml:

message = "Goodbye from config 3"

Кожен з цих файлів є простим TOML-файлом (згадайте про старі INI-файли Windows). Ми знаємо імена цих файлів, тому можемо використовувати функцію 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 . }}.

Запуск цього шаблону створить один 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​

Коли ваш чарт зростає, ви можете знайти необхідність організувати ваші файли більше, і тому ми надаємо метод Files.Glob(pattern string) для допомоги у витягуванні певних файлів з усією гнучкістю шаблонів glob.

.Glob повертає тип Files, тому ви можете викликати будь-які методи Files на повернутому обʼєкті.

Наприклад, уявіть структуру директорій:

foo/:
foo.txt foo.yaml

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

У вас є кілька варіантів з Globs:

{{ $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 і пізніше)

Дуже часто потрібно помістити вміст файлів як у ConfigMaps, так і в Secrets, для монтування в ваші podʼи під час виконання. Для цього ми надаємо кілька методів утиліт для типу Files.

Для подальшої організації особливо корисно використовувати ці методи разом з методом Glob.

Задана структура теки з прикладу Glob:

---
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{- (.Files.Glob "foo/*").AsConfig | nindent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{- (.Files.Glob "bar/*").AsSecrets | nindent 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: |-
bWVzc2FnZSA9ICJIZWxsbyBmcm9tIGNvbmZpZyAxIgo=

Рядки​

Іноді потрібно отримати доступ до кожного рядка файлу у вашому шаблоні. Ми надаємо зручний метод Lines для цього.

Ви можете перебрати Lines, використовуючи функцію range:

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

Якщо файл, на який ви посилаєтесь, порожній або його не існує, Lines повертає порожній список замість завершення з помилкою. Цикл range тоді не виводить нічого, тому посилання на відсутній або порожній файл не спричинить помилку рендерингу шаблону.

Немає можливості передавати файли, що знаходяться поза чартом, під час helm install. Тому, якщо ви просите користувачів надати дані, їх потрібно завантажити за допомогою helm install -f або helm install --set.

Це обговорення завершує наше занурення в інструменти та техніки написання шаблонів Helm. У наступному розділі ми побачимо, як можна використовувати один спеціальний файл, templates/NOTES.txt, для надсилання інструкцій після установки користувачам вашого чарту.