Bash 在分离模式下运行docker时设置环境变量
如果在/root/.bashrc中包含以下行: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" 这样的行产生一个空输出 那么,为什么会发生这种情况?如何设置.
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_value和new_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