从 Docker 容器获取环境变量

Get Environment Variable from Docker Container

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

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

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

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

谢谢。

查看所有环境变量:

docker exec container env

获得一个:

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

如果您不关心何时声明环境变量,@aisbaa 的答案是有效的。如果您想要环境变量,即使它已在 exec /bin/bash 会话中声明,也可以使用类似:

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

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

然后要获取值,请使用:

echo ${out[1]}

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

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

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

docker exec container printenv VARIABLE

使用 docker exec 的缺点是它需要一个 运行 容器,所以如果您不确定,docker inspect -f 可能会很方便一个容器是 运行.

Example #1. 在指定容器中输出以space分隔的环境变量列表:

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

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

None 以上答案向您展示了如何从非 运行 容器中提取变量(如果您将 echo 方法与 run 一起使用,您不会得到任何输出)。

只需 runprintenv,像这样:

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

(请注意 docker-compose 而不是 docker 也有效)

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

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

如果您有机会使用 VSCode and has installed the docker extension, just right+click on the docker you want to check (within the docker extension),Inspect 上单击 ,然后搜索 env,你会发现你所有的 env 变量

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

示例显示 PATH 环境变量:

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

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

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

由于我们正在处理 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"
]

检索特定变量

docker inspect <NAME|ID> | jq -r '.[].Config.Env[]|select(match("^<VAR_NAME>"))|.[index("=")+1:]'

jq