【问题标题】:Dockerfile: An appended variable is not persisted between RUN instructionsDockerfile:附加变量不会在 RUN 指令之间持久化
【发布时间】:2019-03-03 07:55:19
【问题描述】:

我已经导出了变量,以确保即使在新的 shell 实例中,变量也会被持久化,但它不起作用...... 我不知道我该怎么做。 我做了很多研究和测试,没有任何结论。

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 都发生在一个新的shell 中。

但是,既然export VAR2="${VAR2} 被持久化了,为什么VAR2+=" world" 没有持久化呢?

我真的不明白。

提前感谢任何找到解决这种奇怪行为的方法的人。

【问题讨论】:

标签: bash docker dockerfile


【解决方案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"

您可以在 Docker 文件之外创建脚本(上面的my_env)并从内部获取它,或者使用-e, --env, --env-file,后者要好得多。

【讨论】:

  • 我想知道是否有任何方法可以在 .bashrc 中做到这一点,它会更干净......因为RUN 每次都会创建一个新的 shell 实例。
  • 只需将文件名更改为.bashrc,这就是您所要做的。在我看来不是很干净,但这是你的选择。编辑了我的答案,使其适用于 .bashrc
【解决方案2】:

您可以尝试添加“导出”:

RUN if [ $VAR1 = "1" ]; then export VAR2+=" world"; fi \
    && echo $VAR2

【讨论】:

  • 欢迎来到 StackOverflow。请验证您的答案,因为它不起作用。您应该在发布之前对其进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 2018-06-27
  • 2011-03-01
  • 2015-08-16
相关资源
最近更新 更多