Dockerfile:在RUN指令之间不保留附加变量

时间:2019-03-02 17:55:07

标签: bash docker dockerfile

我已经导出了变量,以确保即使在外壳的新实例中,该变量也可以保留,但不起作用... 我不知道该怎么办。 我已经做了很多研究和测试,没有定论。

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}仍然没有保留?

我真的不明白。

在此先感谢任何找到解决这种奇怪行为的方法的人。

2 个答案:

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