从Dockerfile中未声明的docker容器中获取环境变量的最简单方法是什么?
例如,通过某个docker exec container /bin/bash
会话设置的环境变量?
我能做到docker exec container env | grep ENV_VAR
,但我更喜欢只返回价值的东西.
我尝试过使用docker exec container echo "$ENV_VAR"
,但替换似乎发生在容器之外,所以我没有从容器中获取env var,而是从我自己的计算机获取env var.
谢谢.
echo "$ENV_VAR"
在容器内运行以便在容器中进行变量替换的正确方法是:
docker exec container bash -c 'echo "$ENV_VAR"'
要查看所有env变量:
docker exec container env
得到一个:
docker exec container env | grep VARIABLE | cut -d'=' -f2
你可以用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.在新行和grep
所需项目上输出每个env var ,例如,可以像这样检索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的文本/模板包文档,其中包含该格式的所有详细信息.
上面的答案均未显示如何从未运行的容器中提取变量(如果将echo
方法与结合使用run
,将不会获得任何输出)。
只需run
使用printenv
,就像这样:
docker run --rmprintenv
(请注意,这也可以docker-compose
代替docker
)