从Docker容器中获取环境变量

时间:2015-12-02 19:51:31

标签: bash docker environment-variables

从Dockerfile 中未声明的docker容器获取环境变量的最简单方法是什么?

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

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

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

感谢。

10 个答案:

答案 0 :(得分:104)

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

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

答案 1 :(得分:77)

查看所有env变量:

docker exec container env

获得一个:

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

答案 2 :(得分:48)

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

docker exec container printenv VARIABLE

答案 3 :(得分:39)

使用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。在新行上输出每个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 friendly 输出:

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的text/template包文档,其中包含该格式的所有详细信息。

答案 4 :(得分:3)

以上答案均未说明如何从未运行的容器中提取变量(如果将echo方法与run一起使用,将不会获得任何输出)。

run来简单地printenv,就像这样:

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

(请注意,docker-compose而不是docker也是可以的)

答案 5 :(得分:2)

自从我们处理json以来,又一个

docker inspect <NAME|ID> | jq '.[] | .Config.Env'

输出样本

[
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "NGINX_VERSION=1.19.4",
  "NJS_VERSION=0.4.4",
  "PKG_RELEASE=1~buster"
]

答案 6 :(得分:1)

如果您偶然使用VSCode并安装了docker extension,请在要检查的Docker上 + 单击(在docker extension中,在 Inspect 上单击单击,然后在其中搜索 env ,您将找到所有的 env变量

答案 7 :(得分:0)

如果您在宣布环境变量时不关心,那么@ aisbaa的回答是有效的。如果您想要环境变量,即使它已在exec /bin/bash会话中声明,也可以使用以下内容:

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

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

然后获取值,使用:

echo ${out[1]}

答案 8 :(得分:0)

此命令检查主机中的Docker堆栈进程的环境:

{{1}}

答案 9 :(得分:0)

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

示例显示PATH环境变量:

  1. 使用bashecho:此answer声称echo不会产生任何输出,这是不正确的。

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

    docker run --rm --entrypoint printenv <container> PATH