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
выполняется при любых обстоятельствах.