«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-file

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

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

Давайте определим несколько переменных в файле, который мы назовем 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 предлагает механизм, который называется Docker Secrets. Контейнерные сервисы, такие как Kubernetes, AWS или Azure, также предоставляют аналогичные функции.

docker inspect 6b6b033a3240

The output shows the environment variables:

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

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

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

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

«