从Dockerfile中未声明的docker容器中获取环境变量的最简单方法是什么?
例如,通过docker exec容器/bin/bash会话设置的环境变量?
我可以做docker exec容器env | grep ENV_VAR,但我更喜欢只返回值的东西。
我尝试过使用docker exec容器echo“$ENV_VAR”,但替换似乎发生在容器之外,所以我没有从容器中获得env var,而是从我自己的计算机中获得env var。
谢谢。
从Dockerfile中未声明的docker容器中获取环境变量的最简单方法是什么?
例如,通过docker exec容器/bin/bash会话设置的环境变量?
我可以做docker exec容器env | grep ENV_VAR,但我更喜欢只返回值的东西。
我尝试过使用docker exec容器echo“$ENV_VAR”,但替换似乎发生在容器之外,所以我没有从容器中获得env var,而是从我自己的计算机中获得env var。
谢谢。
当前回答
如果你不关心环境变量是什么时候声明的,@aisbaa的答案是有效的。如果你想要环境变量,即使它已经在exec /bin/bash会话中声明了,也可以使用如下代码:
IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)
它不是很漂亮,但它能完成任务。
要得到值,使用:
echo ${out[1]}
其他回答
这个问题中有一个误解,引起了混乱:
您不能访问“正在运行的会话”,因此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' ' '
我们可以使用docker run命令修改非运行容器的入口点。
使用实例显示PATH环境变量。
使用bash和echo:这个答案声称echo不会产生任何输出,这是不正确的。 docker run——rm——entrypoint bash <container> -c 'echo "$PATH"' 使用printenv docker run——rm——entrypoint printenv <容器>的路径
你可以用printenv VARIABLE代替/bin/bash -c 'echo $VARIABLE。它要简单得多,并且不执行替换:
docker exec container printenv VARIABLE
在容器内运行echo "$ENV_VAR"以使变量替换在容器中发生的正确方法是:
docker exec <container_id> bash -c 'echo "$ENV_VAR"'
我们使用的第一种方法是docker inspect <容器名>
第二种方法是docker exec <4 CONTAINER id> bash -c 'echo "$ENV_VAR"'