# Визначення значень змінних середовища за допомогою контейнера ініціалізації

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->








  <div class="feature-state-notice feature-beta" title="Функціональна можливість: EnvFiles">
              <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span> 
              <code>Kubernetes v1.35 [beta]</code>(стандартно увімкнено)</div>


Ця сторінка показує, як налаштувати змінні середовища для контейнерів у Pod за допомогою файлу.

## Перш ніж ви розпочнете

<p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a> або використовувати одну з цих пісочниць:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>




Версія вашого Kubernetes сервера має бути не старішою ніж v1.34.
 <p>Для перевірки версії введіть  <code>kubectl version</code>.</p>


<!-- steps -->

## Як працює дизайн {#how-the-design-works}

В цьому завданні ви створите Pod, який отримує змінні середовища з файлів, проєцюючи ці значення в запущений контейнер.


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/inject/envars-file-container.yaml" download="pods/inject/envars-file-container.yaml"><code>pods/inject/envars-file-container.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-inject-envars-file-container-yaml')" title="Копіювати pods/inject/envars-file-container.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-inject-envars-file-container-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">envfile-test-pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">initContainers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">setup-envfile</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">image</span><span class="p">:</span><span class="w">  </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;sh&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;-c&#39;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;echo \&#34;DB_ADDRESS=\&#39;address\&#39;\nREST_ENDPOINT=\&#39;endpoint\&#39;\&#34; &gt; /data/config.env&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="l">/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-envfile</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;-c&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;env&#34;</span><span class="w"> </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">env</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">DB_ADDRESS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">valueFrom</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">fileKeyRef</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">config.env</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">volumeName</span><span class="p">:</span><span class="w"> </span><span class="l">config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">DB_ADDRESS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">optional</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">restartPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Never</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">emptyDir</span><span class="p">:</span><span class="w"> </span>{}<span class="w">
</span></span></span></code></pre></div></div>
</div>

В маніфесті ви можете побачити, що `initContainer` монтує том `emptyDir` і записує змінні середовища у файл всередині нього, а звичайні контейнери посилаються на нього як на файл, так і на ключ змінної середовища через поле `fileKeyRef`, не потребуючи монтування тому. Коли поле `optional` встановлено в false, вказаний `key` у `fileKeyRef` повинен існувати у файлі змінних середовища.

Том буде змонтовано лише в контейнер, який записує у файл
(`initContainer`), тоді як контейнер-споживач, який споживає змінну середовища, не матиме змонтованого тому.

Формат файлу env відповідає [стандарту файлів env kubernetes](/docs/tasks/inject-data-application/define-environment-variable-via-file/#env-file-syntax).

Під час ініціалізації контейнера kubelet отримує змінні середовища
з вказаних файлів у томі `emptyDir` і надає їх контейнеру.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4><p>Всі типи контейнерів (initContainers, звичайні контейнери, sidecars контейнери та ephemeral контейнери) підтримують завантаження змінних середовища з файлів.</p>
<p>Хоча ці змінні середовища можуть зберігати конфіденційну інформацію, томи <code>emptyDir</code> не забезпечують тих самих механізмів захисту, що й спеціалізовані обʼєкти Secret. Тому вважається, що відкриття конфіденційних змінних середовища для контейнерів за допомогою цієї функції не є кращою практикою з точки зору безпеки.</p>
</div>


Створіть Pod:

```shell
kubectl apply -f https://k8s.io/examples/pods/inject/envars-file-container.yaml
```

Перевірте, чи контейнер у Pod працює:

```shell
kubectl get pods
```

```shell
# Якщо новий Pod ще не справний, повторіть цю команду кілька разів.
kubectl get pods
```

Перевірте журнали контейнера на наявність змінних середовища:

```shell
kubectl logs envfile-test-pod -c use-envfile | grep DB_ADDRESS
```

Вивід показує значення вибраних змінних середовища:

```console
DB_ADDRESS=address
```

## Синтаксис файлів env {#env-file-syntax}

Формат файлу env, який використовує Kubernetes, є чітко визначеним підмножиною семантики змінних середовища для POSIX-сумісного bash. Будь-який файл env, який підтримує Kubernetes, створюватиме ті самі змінні середовища, що й POSIX-сумісний bash. Однак POSIX-сумісний bash підтримує деякі додаткові формати, які Kubernetes не приймає.

Приклад:

```env
MY_VAR='my-literal-value'
```

### Правила {#rules}

* Оголошення змінної: використовуйте форму `VAR='value'`. Пробіли навколо `=` ігноруються; пробіли на початку рядка ігноруються; порожні рядки ігноруються.
* Значення в лапках: значення повинні бути укладені в одинарні лапки (`'`).
  * Вміст всередині одинарних лапок зберігається буквально. Не застосовується обробка екрануючих послідовностей, згортання пробілів або інтерпретація символів.
  * Нові рядки всередині одинарних лапок зберігаються (підтримуються багаторядкові значення).
* Коментарі: рядки, що починаються з `#`, розглядаються як коментарі та ігноруються. Символ `#` всередині значення в одинарних лапках не є коментарем.

Приклади:

```env
# comment
DB_ADDRESS='address'

MULTI='line1
line2'
```

### Непідтримувані форми {#unsupported-forms}

* Значення без лапок **заборонені**:
  * `VAR=value` — не підтримується.
* Значення в подвійних лапках **заборонені**:
  * `VAR="value"`  — не підтримується.
* Кілька сусідніх рядків у лапках **не** підтримуються:
  * `VAR='val1''val2'` — не підтримується.
* Будь-яка форма інтерполяції, розширення або конкатенації **не** підтримується:
  * `VAR='a'$OTHER` або `VAR=${OTHER}` — не підтримується.

Сувора вимога щодо використання одинарних лапок гарантує, що kubelet сприймає значення буквально під час завантаження змінних середовища з файлів.

## Що далі

* Дізнайтеся більше про [змінні середовища](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/).
* Ознайомтесь з [Оголошенням змінних середовища для контейнера](/docs/tasks/inject-data-application/define-environment-variable-container/)
* Дізнайтеся про [Експонування інформації про Pod для контейнерів через змінні середовища](/docs/tasks/inject-data-application/environment-variable-expose-pod-information)
