Подтвердить что ты не робот

Получить переменную окружения из контейнера Docker

Какой самый простой способ получить переменную среды из контейнера докеров, которая не была объявлена ​​в файле Docker?

Например, переменная среды, которая была установлена ​​через некоторый сеанс docker exec container /bin/bash?

Я могу сделать docker exec container env | grep ENV_VAR, но я бы предпочел что-то, что просто вернет значение.

Я пробовал использовать docker exec container echo "$ENV_VAR", но замена, похоже, происходит за пределами контейнера, поэтому я не получаю env var из контейнера, а скорее env var с моего собственного компьютера.

Спасибо.

4b9b3361

Ответ 1

Правильный способ запуска echo "$ENV_VAR" внутри контейнера, чтобы замена переменной происходила в контейнере:

docker exec container bash -c 'echo "$ENV_VAR"'

Ответ 2

Чтобы просмотреть все переменные env:

docker exec container env

Чтобы получить один:

docker exec container env | grep VARIABLE | cut -d'=' -f2

Ответ 3

Вы можете использовать printenv VARIABLE вместо /bin/bash -c 'echo $VARIABLE. Это намного проще и не выполняет подстановки:

docker exec container printenv VARIABLE

Ответ 4

Недостатком использования docker exec является то, что для этого требуется контейнер running, поэтому docker inspect -f может быть удобно, если вы не уверены, что контейнер запущен.

Пример # 1. Вывести список переменных среды, разделенных пробелом, в указанном контейнере:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name

вывод будет выглядеть следующим образом:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Пример # 2. Вывести каждый env var в новой строке и grep необходимые элементы, например, параметры контейнера mysql можно получить следующим образом:

docker inspect -f \
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
    container_name | grep MYSQL_

выведет:

MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52

Пример # 3.. Измените пример выше, чтобы получить bash дружественный вывод, который может быть непосредственно использован в ваших скриптах:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
   container_name | grep MYSQL

выведет:

export MYSQL_PASSWORD=secret
export MYSQL_ROOT_PASSWORD=supersecret
export MYSQL_USER=demo
export MYSQL_DATABASE=demodb
export MYSQL_MAJOR=5.5
export MYSQL_VERSION=5.5.52

Если вы хотите погрузиться глубже, перейдите в Gos text/template документацию пакета со всеми подробностями формата.

Ответ 5

Ни один из приведенных выше ответов не показывает, как извлечь переменную из неработающего контейнера (если вы используете подход echo с run, вы не получите никакого вывода).

Просто run с printenv, вот так:

docker run --rm <container> printenv <MY_VAR>

(Обратите внимание, что docker-compose вместо docker тоже работает)

Ответ 6

Ответ @aisbaa работает, если вам неинтересно, когда была объявлена ​​переменная среды. Если вы хотите переменную окружения, даже если она была объявлена ​​внутри сеанса exec /bin/bash, используйте что-то вроде:

IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)

Это не очень красиво, но он выполняет свою работу.

Чтобы получить значение, используйте:

echo ${out[1]}

Ответ 7

Эта команда проверяет среду процессов стека докеров на хосте:

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0

Ответ 8

Если по какой-либо причине вы используете VSCode и установили расширение докера, просто right + click на докере, который вы хотите проверить (в пределах расширения докера), click на Inspect, и там ищите env, вы найдете все значения переменных env