Перейти к основному содержимому

Передача переменных среды в контейнеры Docker

· 3 мин. чтения

1. Обзор

Часто бывает полезно отделить наши службы от их конфигурации. Для двенадцатифакторного приложения мы должны хранить конфигурацию в среде .

Конечно, это означает, что нам понадобится способ внедрить конфигурацию в наш сервис.

В этом руководстве мы добьемся этого, передав переменные среды в контейнер Docker .

2. Использование –env , -e

В этом руководстве мы будем использовать небольшой (5 МБ) образ Linux под названием Alpine. Начнем с локального извлечения образа:

docker pull alpine:3

Когда мы запускаем наш контейнер Docker, мы можем передавать переменные среды в виде пар ключ-значение непосредственно в командную строку, используя параметр –env (или его короткую форму -e ).

Например, давайте выполним следующую команду:

$ docker run --env VARIABLE1=foobar alpine:3 env

Проще говоря, мы отражаем переменные среды, которые мы установили, обратно в консоль:

VARIABLE1=foobar

Как видно, контейнер Docker правильно интерпретирует переменную VARIABLE1 .

Также мы можем опустить значение в командной строке, если переменная уже существует в локальной среде .

Например, давайте определим локальную переменную среды:

$ export VARIABLE2=foobar2

Затем давайте укажем переменную окружения без ее значения:

docker run --env VARIABLE2 alpine:3 env

И мы видим, что Docker все еще получает значение, на этот раз из окружающей среды:

VARIABLE2=foobar2

3. Использование –env-файла

Приведенное выше решение подходит, когда количество переменных невелико. Однако, как только у нас будет больше, чем несколько переменных, это может быстро стать громоздким и подверженным ошибкам.

Альтернативное решение — использовать текстовый файл для хранения наших переменных , используя стандартный формат ключ=значение .

Давайте определим несколько переменных в файле, который мы назовем my-env.txt :

$ echo VARIABLE1=foobar1 > my-env.txt
$ echo VARIABLE2=foobar2 >> my-env.txt
$ echo VARIABLE3=foobar3 >> my-env.txt

Теперь давайте вставим этот файл в наш контейнер Docker:

$ docker run --env-file my-env.txt alpine:3 env

Наконец, давайте посмотрим на вывод:

VARIABLE1=foobar1
VARIABLE2=foobar2
VARIABLE3=foobar3

4. Использование Docker Compose

Docker Compose также предоставляет средства для определения переменных среды. Для тех, кто интересуется этой конкретной темой, ознакомьтесь с нашим руководством по Docker Compose для получения более подробной информации.

5. Остерегайтесь конфиденциальных ценностей

Чаще всего одной из переменных будет пароль к базе данных или внешней службе. Мы должны быть осторожны с тем, как мы внедряем эти переменные в контейнер Docker.

Передача этих значений непосредственно через командную строку, вероятно, наименее безопасна, так как существует больший риск утечки конфиденциальных значений куда-то, чего мы не ожидаем, например, в нашей системе управления исходным кодом или в списке процессов ОС.

Лучше определить конфиденциальные значения в локальной среде или в файле, поскольку и то, и другое можно защитить от несанкционированного доступа.

Однако важно понимать, что любой пользователь, имеющий доступ к среде выполнения Docker, может проверить работающий контейнер и обнаружить секретные значения .

Давайте проверим работающий контейнер:

docker inspect 6b6b033a3240

Вывод показывает переменные среды:

"Config": {
// ...
"Env": [
"VARIABLE1=foobar1",
"VARIABLE2=foobar2",
"VARIABLE3=foobar3",
// ...
]
}

В тех ситуациях, когда безопасность вызывает беспокойство, важно упомянуть, что Docker предлагает механизм под названием Docker Secrets . Контейнерные сервисы, такие как Kubernetes , AWS или Azure, также предоставляют аналогичные функции.

6. Заключение

В этом кратком руководстве мы рассмотрели несколько различных вариантов внедрения переменных среды в контейнер Docker.

Хотя каждый подход работает хорошо, наш выбор в конечном итоге будет зависеть от различных параметров, таких как безопасность и ремонтопригодность.