示例1:-
FROM ubuntu:latest
SHELL ["/bin/bash", "-c"]
RUN echo "export MY_VARIABLE=my_value" >> ~/.profile
RUN cat ~/.profile
RUN "source ~/.profile && echo env variable4: $MY_VARIABLE"
sudo docker build --no-cache -t hello-image --progress plain .
o/p:-
variable4:my_value
示例2:-
FROM ubuntu:latest
RUN echo "export MY_VARIABLE=my_value" >> ~/.profile
RUN cat ~/.profile
RUN /bin/bash -c "source ~/.profile && echo env variable4: $MY_VARIABLE"
sudo docker build --no-cache -t hello-image --progress plain .
o/p:-
variable4:
为什么在第一个示例中,“$MY_VARIABLE”得到值“my_value”,但在第二个示例中它是空字符串?
RUN /bin/bash -c "source ~/.profile && echo env variable4: $MY_VARIABLE"
当 run、entrypoint 或 cmd 不是 exec 格式(JSON 数组)时,内容将传递到 shell 来执行。所以上面的运行如下:
/bin/sh -c "/bin/bash -c \"source ~/.profile && echo env variable4: $MY_VARIABLE\""
在这种情况下,
$MY_VARIABLE
被第一个/bin/sh
扩展,然后运行bash来获取配置文件并打印没有任何变量的回显(因为它已经扩展了)。