如果我在/root/.bashrc中包含以下行:
export $A = "AAA"
然后当我以交互模式运行docker容器(docker run -i)时,$ A变量保持其值。但是,如果我以分离模式运行容器,我无法访问该变量。即使我运行容器明确地采购.bashrc像
docker run -d my_image /bin/bash -c "cd /root && source .bashrc && echo $A"
这样的行会产生空输出。
那么,为什么会这样呢?如何设置.bashrc文件中定义的环境变量?
非常感谢任何帮助!
答案 0 :(得分:2)
第一个问题是您运行的命令有$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会增加一个错误。因此,我们可以设置一个伪的TTY:,而不是交互模式
docker run -t my_image /bin/bash -i -c "echo \$A"
答案 1 :(得分:0)
在运行了一些测试之后,似乎以分离模式运行容器时,根据您在Dockerfile中的位置,覆盖默认环境变量并不一定总是按照我们想要的方式发生。
例如,在这样的分离容器中运行容器:
docker run **-d** --name image_name_container image_name
无论您在内部中定义的任何ENV变量,Dockerfile都会在所有地方生效(阅读其余内容,您将了解无处不在的含义)。
简单dockerfile的示例(高山只是轻量级的Linux发行版):
FROM alpine:latest
#declaring a docker env variable and giving it a default value
ENV MY_ENV_VARIABLE dummy_value
#copying two dummy scripts into a place where i can execute them straight away
COPY ./start.sh /usr/sbin
COPY ./not_start.sh /usr/sbin
#in this script i could do: echo $MY_ENV_VARIABLE > /test1.txt
RUN not_start.sh
RUN echo $MY_ENV_VARIABLE > /test2.txt
#in this script i could do: echo $MY_ENV_VARIABLE > /test3.txt
ENTRYPOINT ["start.sh"]
现在,如果要在分离的中运行容器并覆盖一些ENV变量,如下所示:
docker run **-d** -e MY_ENV_VARIABLE=new_value --name image_name_container image_name
惊喜!变量MY_ENV_VARIABLE仅在ENTRYPOINT中运行的脚本内被覆盖(我检查过,如果将ENTRYPOINT
替换为CMD
,也会发生相同的情况)。您可以从此 start.sh 脚本调用的下标中也将其覆盖。但是在RUN
dockerfile命令或dockerfile本身中调用的MY_EV_VARIABLE变量不会被覆盖。
换句话说,我们将 $ MY_ENV_VARIABLE 替换为值 dummy_value 和 < em> new_value ,具体取决于您是否在ENTRYPOINT
中。