从Docker容器中获取环境变量

Cit*_*nen 99 bash environment-variables docker

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

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

我能做到docker exec container env | grep ENV_VAR,但我更喜欢只返回价值的东西.

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

谢谢.

jwo*_*der 115

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

docker exec container bash -c 'echo "$ENV_VAR"'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,所有这些答案都取决于某些外壳。我无法通过可执行文件和临时映像获取环境变量。 (3认同)

ais*_*baa 90

要查看所有env变量:

docker exec container env
Run Code Online (Sandbox Code Playgroud)

得到一个:

docker exec container env | grep VARIABLE | cut -d'=' -f2
Run Code Online (Sandbox Code Playgroud)

  • 嗯,现在难多了。尝试`docker检查容器`。 (2认同)

gen*_*too 59

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

docker exec container printenv VARIABLE
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`printenv` 来打印所有变量。 (6认同)
  • 这应该是最终答案 (4认同)

Ser*_*nko 50

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

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

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3
Run Code Online (Sandbox Code Playgroud)

例#2.在新行和grep所需项目上输出每个env var ,例如,可以像这样检索mysql容器的设置:

docker inspect -f \
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
    container_name | grep MYSQL_
Run Code Online (Sandbox Code Playgroud)

将输出:

MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52
Run Code Online (Sandbox Code Playgroud)

例#3.让我们修改上面的例子来获得一个可以直接在你的脚本中使用的bash友好输出:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
   container_name | grep MYSQL
Run Code Online (Sandbox Code Playgroud)

将输出:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 这是最好的答案。我认为这应该是一个单独问题的答案(当容器关闭时) (2认同)
  • 这是最好的答案,因为所有其他解决方案都使用“docker exec”,这取决于容器支持“exec”的任何命令。另一方面,这个答案适用于任何容器,因为它仅依赖于容器元数据。 (2认同)
  • @Stefan,完整的示例如下所示: `{{range $key, $value := .State}}{{$key}}="{{$value}}"{{println}}{{end}} `。 (2认同)

Ale*_*sco 7

因为我们正在处理 json,所以还有一个

docker inspect <NAME|ID> | jq '.[] | .Config.Env'
Run Code Online (Sandbox Code Playgroud)

输出样本

[
  "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"
]
Run Code Online (Sandbox Code Playgroud)


sar*_*ink 5

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

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

docker run --rm <container> printenv <MY_VAR>
Run Code Online (Sandbox Code Playgroud)

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


ddi*_*ppa 5

如果您使用VSCode并安装了docker 扩展,只需在要检查的 docker 上(在docker 扩展内)上right+ + ,在Inspect上,然后搜索env,您将找到所有env 变量clickclick