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

Получить переменную среды из контейнера Docker

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

1. Обзор

Docker — это контейнерная платформа, которая упаковывает приложение вместе со всеми его зависимостями. В идеале для запуска этих приложений требуется определенная среда. В Linux мы используем переменные среды для выполнения этого требования. Эти переменные определяют поведение приложения.

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

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

2. Понимание переменных среды в Linux

Переменные среды — это динамический набор пар ключ-значение, доступный для всей системы. Эти переменные могут помочь системе найти пакет, настроить поведение любого сервера или даже сделать вывод терминала bash интуитивно понятным.

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

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

3. Получить с помощью команды docker exec

В целях демонстрации давайте сначала запустим контейнер Alpine Docker и передадим ему некоторые переменные среды:

docker run -itd --env "my_env_var=foreach" --name mycontainer alpine
9de9045b5264d2de737a7ec6ba23c754f034ff4f35746317aeefcea605d46e84

Здесь мы передаем my_env_var со значением foreach внутри контейнера Docker с именем mycontainer .

Давайте теперь используем команду docker exec для получения переменной среды с именем my_env_var :

$ docker exec mycontainer /usr/bin/env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=9de9045b5264
my_env_var=foreach
HOME=/root

Здесь мы запускаем утилиту /usr/bin/env внутри контейнера Docker. С помощью этой утилиты вы можете просмотреть все переменные среды, установленные внутри контейнеров Docker. Обратите внимание, что наш my_env_var также присутствует в выводе.

Мы также можем использовать следующую команду для достижения аналогичных результатов:

$ docker exec mycontainer /bin/sh -c /usr/bin/env
HOSTNAME=9de9045b5264
SHLVL=1
HOME=/root
my_env_var=foreach
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

Обратите внимание, что переменных среды больше, чем в предыдущем выводе. Это так, потому что на этот раз мы выполняем команду с помощью двоичного файла /bin/sh . Этот двоичный файл неявно устанавливает некоторые дополнительные переменные среды.

Кроме того, оболочка /bin/sh не обязательно должна присутствовать во всех образах Docker. Например, в образе Centos Docker, содержащем оболочку /bin/bash , мы получим переменные среды с помощью следующей команды :

$ docker run -itd --env "container_type=centos" --name centos_container centos
aee6f2718f18723906f7ab18ab9c37a539b6b2c737f588be71c56709948de9eb
$ docker exec centos_container bash -c /usr/bin/env
container_type=centos
HOSTNAME=aee6f2718f18
PWD=/
HOME=/root
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

Мы также можем получить значение одной переменной среды с помощью команды docker exec :

$ docker exec mycontainer printenv my_env_var
foreach

printenv — еще одна утилита командной строки, которая отображает переменные среды в Linux. Здесь мы передаем имя переменной env my_env_var в качестве аргумента функции printenv . Это напечатает значение my_env_var .

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

4. Извлечь с помощью команды docker inspect

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

docker inspect предоставляет подробную информацию обо всех ресурсах Docker. Вывод в формате JSON. Следовательно, мы можем фильтровать вывод в соответствии с нашими требованиями.

Давайте манипулируем командой docker inspect , чтобы отображались только переменные среды контейнера:

$ docker inspect mycontainer --format "{{.Config.Env}}"
[my_env_var=foreach PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

Здесь мы отфильтровали переменные среды из вывода проверки докера с помощью параметра –format . Опять же, my_env_var присутствует в выводе.

Мы также можем получить одну переменную среды, используя команду docker inspect :

$ docker inspect mycontainer | jq -r '.[].Config.Env[]|select(match("^my_env_var"))|.[index("=")+1:]'
foreach

jq — это легкий процессор JSON, который может анализировать и преобразовывать данные JSON. Здесь мы передаем вывод JSON проверки докера команде jq . Затем он ищет переменную my_env_var и отображает ее значение, разбивая его на «=».

Обратите внимание, что мы также можем использовать идентификатор контейнера с командами docker exec и docker inspect .

В отличие от docker exec команда docker inspect работает как с остановленными, так и с запущенными контейнерами.

5. Вывод

В этой статье мы узнали, как получить все переменные среды из контейнера Docker. Мы начали с обсуждения значения переменных окружения в Linux. Затем мы рассмотрели команды docker exec и docker inspect для получения переменных среды.

Подход docker exec имеет некоторые ограничения, в то время как команда docker inspect выполняется при любых обстоятельствах.