我已经导出了变量,以确保即使在外壳的新实例中,该变量也可以保留,但不起作用... 我不知道该怎么办。 我已经做了很多研究和测试,没有定论。
Dockerfile:
FROM bitnami/minideb:stretch
SHELL ["/bin/bash", "-c"]
ARG VAR1="1"
ARG VAR2="Hello"
# Export arguments
RUN export VAR1="${VAR1}" \
&& export VAR2="${VAR2}"
# Output "Hello world"
RUN if [ $VAR1 = "1" ]; then VAR2+=" world"; fi \
&& echo $VAR2
# Output "Hello" instead of "Hello World"
RUN echo $VAR2
确保每个RUN
都出现在新的外壳中。
但是为什么VAR2+=" world"
仍然存在,为什么export VAR2="${VAR2}
仍然没有保留?
我真的不明白。
在此先感谢任何找到解决这种奇怪行为的方法的人。
答案 0 :(得分:1)
根据documentation,您可以像上面一样使用-e, --env, --env-file
或bash的export
传递环境变量。
您无法使用bash
脚本设置变量,请尝试在if子句中export
设置另一个变量(例如VAR3
)。
您可以使用this answer之类的东西,但这确实很丑:
FROM bitnami/minideb:stretch
SHELL ["/bin/bash", "-c"]
ARG VAR1="1"
ARG VAR2="Hello"
# Export arguments
RUN export VAR1="${VAR1}" \
&& export VAR2="${VAR2}"
RUN echo 'if [ $VAR1 = "1" ]; then VAR2+=" world"; fi' > ~/.bashrc
# Output "Hello" instead of "Hello World"
RUN source ~/.bashrc && echo "$VAR2"
您可以将脚本(上面的my_env
)放置在Docker文件之外,并从Docker文件中获取脚本,或者使用-e, --env, --env-file
,后者会更好。
答案 1 :(得分:-2)
您可以尝试添加“导出”:
RUN if [ $VAR1 = "1" ]; then export VAR2+=" world"; fi \
&& echo $VAR2