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

时间:2016-01-05 04:19:12

标签: bash shell docker

如果我在/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文件中定义的环境变量?

非常感谢任何帮助!

2 个答案:

答案 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中。