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

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

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

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

谢谢。


当前回答

使用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的文本/模板包文档中了解格式的所有细节。

其他回答

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

您不能访问“正在运行的会话”,因此bash会话不能改变任何东西。

docker exec -ti container /bin/bash

在容器中启动一个新的控制台进程,所以如果你导出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' ' '

查询所有env变量。

docker exec container env

要得到一个:

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

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

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

我们使用的第一种方法是docker inspect <容器名>

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

使用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的文本/模板包文档中了解格式的所有细节。