Ответ 1
Правильный способ запуска echo "$ENV_VAR"
внутри контейнера, чтобы замена переменной происходила в контейнере:
docker exec container bash -c 'echo "$ENV_VAR"'
Какой самый простой способ получить переменную среды из контейнера докеров, которая не была объявлена в файле Docker?
Например, переменная среды, которая была установлена через некоторый сеанс docker exec container /bin/bash
?
Я могу сделать docker exec container env | grep ENV_VAR
, но я бы предпочел что-то, что просто вернет значение.
Я пробовал использовать docker exec container echo "$ENV_VAR"
, но замена, похоже, происходит за пределами контейнера, поэтому я не получаю env var из контейнера, а скорее env var с моего собственного компьютера.
Спасибо.
Правильный способ запуска echo "$ENV_VAR"
внутри контейнера, чтобы замена переменной происходила в контейнере:
docker exec container bash -c 'echo "$ENV_VAR"'
Чтобы просмотреть все переменные env:
docker exec container env
Чтобы получить один:
docker exec container env | grep VARIABLE | cut -d'=' -f2
Вы можете использовать printenv VARIABLE
вместо /bin/bash -c 'echo $VARIABLE
. Это намного проще и не выполняет подстановки:
docker exec container printenv VARIABLE
Недостатком использования 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 документацию пакета со всеми подробностями формата.
Ни один из приведенных выше ответов не показывает, как извлечь переменную из неработающего контейнера (если вы используете подход echo
с run
, вы не получите никакого вывода).
Просто run
с printenv
, вот так:
docker run --rm <container> printenv <MY_VAR>
(Обратите внимание, что docker-compose
вместо docker
тоже работает)
Ответ @aisbaa работает, если вам неинтересно, когда была объявлена переменная среды. Если вы хотите переменную окружения, даже если она была объявлена внутри сеанса exec /bin/bash
, используйте что-то вроде:
IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)
Это не очень красиво, но он выполняет свою работу.
Чтобы получить значение, используйте:
echo ${out[1]}
Эта команда проверяет среду процессов стека докеров на хосте:
pidof dockerd containerd containerd-shim | tr ' ' '\n' \
| xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0
Если по какой-либо причине вы используете VSCode и установили расширение докера, просто right + click на докере, который вы хотите проверить (в пределах расширения докера), click на Inspect, и там ищите env, вы найдете все значения переменных env