从Docker容器获取环境变量

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

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

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

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

谢谢。

287061 次浏览

查询所有env变量。

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可能很方便。

示例# 1。输出指定容器中以空格分隔的环境变量列表:

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

输出如下所示:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

例# 2。输出每个env变量在新行和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的文本/模板包文档中了解格式的所有细节。

上面的答案都没有告诉你如何从非运行的容器中提取变量(如果你对run使用echo方法,你不会得到任何输出)。

简单的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并且已经安装了码头工人扩展,只要在你想检查的docker上(在码头工人扩展中)正确的+点击检查上的点击,然后在那里搜索env,你会找到所有的env变量

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

使用实例显示PATH环境变量。

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

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
    
  2. using 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:]'

看到金桥

我们用来找到ENV变量的第一种方法是docker inspect <container name>

第二种方法是docker exec <4 alphanumeric letter of CONTAINER id> bash -c 'echo "$ENV_VAR"'

这个问题中有一个误解,引起了混乱:

您无法访问“运行会话”。,所以没有bash会话可以改变任何东西。

docker exec -ti container /bin/bash

在容器中启动一个新的控制台进程,所以如果你执行export VAR=VALUE,它将在你离开shell时消失,它将不再存在。

举个很好的例子:

# assuming TESTVAR did not existed previously this is empty
docker exec container env | grep TESTVAR


# -> TESTVAR=a new value!
docker exec container /bin/bash -c 'TESTVAR="a new value!" env' | grep TESTVAR


# again empty
docker exec container env | grep TESTVAR

env中的变量来自Dockerfile或命令、docker本身以及入口点设置的任何东西。

其他答案都很好。但是如果你真的需要获得启动程序时使用的环境属性,那么你可以检查容器中的/proc/pid/environ内容,其中pid是正在运行命令的容器进程id。

# environmental props
docker exec container cat /proc/pid/environ | tr '\0' '\n'


# you can check this is the correct pid by checking the ran command
docker exec container cat /proc/pid/cmdline | tr '\0' ' '