Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在分离模式下运行docker时设置环境变量_Bash_Shell_Docker - Fatal编程技术网

Bash 在分离模式下运行docker时设置环境变量

Bash 在分离模式下运行docker时设置环境变量,bash,shell,docker,Bash,Shell,Docker,如果在/root/.bashrc中包含以下行: export $A = "AAA" 然后,当我以交互模式运行docker容器(docker run-I)时,$A变量保持其值。但是,如果以分离模式运行容器,则无法访问该变量。即使我像这样显式地运行容器 docker run -d my_image /bin/bash -c "cd /root && source .bashrc && echo $A" 这样的行产生一个空输出 那么,为什么会发生这种情况?如何设置.

如果在/root/.bashrc中包含以下行:

export $A = "AAA"
然后,当我以交互模式运行docker容器(docker run-I)时,$A变量保持其值。但是,如果以分离模式运行容器,则无法访问该变量。即使我像这样显式地运行容器

docker run -d my_image /bin/bash -c "cd /root && source .bashrc && echo $A"
这样的行产生一个空输出

那么,为什么会发生这种情况?如何设置.bashrc文件中定义的环境变量


任何帮助都将不胜感激

第一个问题是,您正在运行的命令的
$A
由主机shell(而不是容器shell)解释。在您的主机上,
$A
可能是黑色的,因此您的命令变成:

docker run -i my_image /bin/bash -c "cd /root && source .bashrc && echo "
这正是它所说的。我们可以转义变量,以便将其发送到容器并在容器中正确计算:

docker run -i my_image /bin/bash -c "echo \$A"
但这也将是空的,因为尽管容器是空的,但shell不处于交互模式。但我们可以强迫它:

docker run -i my_image /bin/bash -i -c "echo \$A"
呜呜,我们终于得到了我们想要的结果。但是由于没有TTY,bash又增加了一个错误。因此,我们可以设置一个psuedo TTY,而不是交互模式:

docker run -t my_image /bin/bash -i -c "echo \$A"

在运行了一些测试之后,在分离模式下运行容器时,根据您在Dockerfile中的位置,跳过默认环境变量似乎并不总是以我们想要的方式发生

例如,在分离的容器中运行容器,如下所示:

docker run **-d** --name image_name_container image_name
无论您在中定义了什么环境变量,Dockerfile都会在任何地方生效(阅读其余部分,您将了解everywhere的含义)

简单dockerfile示例(alpine只是一个轻量级linux发行版):

现在,如果要在分离的中运行容器,并覆盖一些环境变量,如下所示:

docker run **-d** -e MY_ENV_VARIABLE=new_value --name image_name_container image_name
惊喜!var MY_ENV_变量仅在入口点中运行的脚本中被覆盖(我检查过,如果将
ENTRYPOINT
替换为
CMD
,也会发生同样的情况)。它还将被覆盖在一个下标中,您可以从start.sh脚本调用该下标。但是在
RUN
dockerfile命令内或dockerfile本身内调用的MY_EV_变量不会被忽略


换句话说,$MY_ENV_VARIABLE将被值dummy_valuenew_value替换,具体取决于您是否在
入口点。

太棒了!只有一个问题,最后两个代码段是相同的。设置伪TTY的代码是什么?谢谢!抱歉,我将其修改为
-t
(伪TTY),而不是
-I
。但它也可以是
-it
(伪TTY和交互式)。我试图说明的一点是,交互控制台不是由bash本身继承的,仍然必须在bash上设置。很抱歉,问题的标题明确提出了“分离模式”,而您的答案正好相反。有人在分离模式下找到了方法吗?我在Docker官方文档中没有看到任何提及。[因此,为了每个人,我留下了这条信息。
docker run **-d** -e MY_ENV_VARIABLE=new_value --name image_name_container image_name