从Docker容器获取环境变量


124

尚未在Dockerfile中声明的Docker容器获取环境变量的最简单方法是什么

例如,通过某个docker exec container /bin/bash会话设置的环境变量?

我可以做到docker exec container env | grep ENV_VAR,但我更喜欢只返回值的东西。

我尝试使用docker exec container echo "$ENV_VAR",但是替换似乎发生在容器之外,因此我没有从容器中获取env var,而是从我自己的计算机中获取了env var。

谢谢。


有什么理由不愿意使用env和grep吗?
aisbaa 2015年

我只需要价值。如果我理解正确,则需要解析grep调用的输出,而我宁愿避免这种情况。
雪铁龙2015年

我以为在exec会话中设置的变量不会影响主进程或后续的exec会话?
Paul Becotte

Answers:


136

echo "$ENV_VAR"在容器中运行以使变量替换发生在容器中的正确方法是:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

4
请注意,所有这些答案都取决于某些外壳。我无法通过可执行文件和临时映像获取环境变量。
理查德

docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
亨里克

我收到错误“错误:没有这样的容器:容器”。通过SSH登录后,我正在执行命令。
kunwar nitesh '19

1
@kunwarnitesh:您需要使用要操作的容器的名称替换“容器”。
jwodder

1
制作container字,让人们明白这是一个变量
安瓦尔

117

要查看所有环境变量:

docker exec container env

获得一个:

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

我的问题是我不想走那条路。此外,后续的问题:docker exec container envdocker exec -it container /bin/bash,然后env吐出不同的东西。为什么?
Citronen

嗯...这可能是我构建这种情况的
Docker

2
嗯,现在要困难得多。尝试docker inspect container
aisbaa

docker inspect container似乎有相同的限制。如果在运行容器后创建环境变量,则该变量不会出现在docker inspect(在env部分中)的调用中。
雪铁龙2015年

我认为这是比当前接受的答案更好的答案。例如,我们有几个bash命令不支持的容器alpine-node。因此,使用exec container bash -c "echo $ENV_VAR"不起作用。使用exec container env适合我的情况。使用exec container printenv也可以。
rahmatns

78

您可以使用printenv VARIABLE代替/bin/bash -c 'echo $VARIABLE。它简单得多,并且不执行替换:

docker exec container printenv VARIABLE

7
这应该是最终答案
KiJéy18年

4
或者只是printenv打印所有变量。
naXa

这甚至适用于kubernetes:kubectl exec pod-name printenv MY_VARIABLE。
6

58

使用的缺点docker exec是它需要一个正在运行的容器,因此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。在换行符上输出每个环境变量和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

如果您想更深入,请转到Go的文本/模板包文档,其中包含格式的所有详细信息。


1
那是最好的答案。我认为这应该是一个单独问题的答案(当集装箱倒下时)
Nickolay Kondratenko

这是唯一对我有用的答案。docker exec总是说我的容器不知道。
晚安书呆子骄傲

7

上面的答案均未显示如何从未运行的容器中提取变量(如果将echo方法与结合使用run,将不会获得任何输出)。

只需run使用printenv,就像这样:

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

(请注意,这也可以docker-compose代替docker


非常简单!我选择了这种方法。
opncow

或者只是printenv打印所有变量。
naXa


0

如果您不在乎何时声明环境变量,则@aisbaa的答案有效。如果您想要环境变量,即使已在exec /bin/bash会话中声明了环境变量,请使用类似以下内容的方法:

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

它不是很漂亮,但是可以完成工作。

要获取该值,请使用:

echo ${out[1]}

请参阅jwodder的答案。
Citronen

0

该命令检查主机中docker stack进程的环境:

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

0

我们可以entrypoint使用以下docker run命令修改未运行的容器。

示例显示PATH环境变量:

  1. using bashand echo:这个答案声称echo不会产生任何输出,这是不正确的。

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. 使用 printenv

    docker run --rm --entrypoint printenv <container> PATH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.