当前位置: 首页 > 知识库问答 >
问题:

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

拓拔富
2023-03-14

我已经导出了变量,以确保即使在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

确保每次运行都在一个新的shell中进行。

但是为什么heckVAR2=“world”不会持久化,因为export VAR2=“${VAR2}会持久化?

我真的不明白。

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


共有2个答案

程冥夜
2023-03-14

您可以尝试添加"导出":

RUN if [ $VAR1 = "1" ]; then export VAR2+=" world"; fi \
    && echo $VAR2
澹台承
2023-03-14

根据文档,您可以使用-e、-env、-env file或bash的export传递环境变量,如上所述。

无法使用bash脚本设置变量,请尝试在if子句中导出另一个变量(例如VAR3)。

你可以这样回答,但它真的很难看:

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,后者要好得多。

 类似资料:
  • 问题内容: 我正在编写一个dockerfile,并希望将“ ls”命令的输出放入一个变量,如下所示: 在此,“ dir”内部只有一个文件。 dockerfile中的以下RUN指令不起作用 问题答案: 您不能保存变量供以后在其他命令中使用(如果您打算这样做)。这是因为每种情况都发生在新的外壳中。 但是,如果只想捕获输出,则应该可以在一个复合命令中完成它。例如: 或者只是使用subshel​​l内联:

  • 问题内容: 我有一个Dockerfile,我正在将其安装在一起以安装Vanilla python环境(稍后将在其中安装应用程序)。 构建运行正常,直到最后一行,我得到以下异常: 如果我进入该目录(只是为了测试是否已完成前面的步骤),我可以看到文件按预期存在: 如果我尝试仅运行命令,则会收到与上述相同的“未找到”错误。但是,如果我运行交互式shell会话,则源代码确实可以工作: 我可以从这里运行脚本

  • 我有一个Dockerfile,我将把它放在一起安装一个vanilla python环境(我将在其中安装一个应用程序,但以后再安装)。 构建运行正常,直到最后一行,我得到以下异常: 从Dockerfile运行指令运行shell脚本的最佳方法是什么来解决这个问题(我运行Ubuntu12.04LTS的默认基本映像)。

  • 问题内容: 我对何时应该使用vs 感到困惑。例如,要执行bash / shell命令(即),我将始终使用它,或者是否存在我会使用的情况?试图了解有关这两个类似指令的最佳实践。 问题答案: RUN是映像构建步骤,命令后将容器的状态提交到容器映像。一个Dockerfile可以有很多步骤相互叠加以构建映像。 CMD是启动构建映像时容器默认执行的命令。Dockerfile将仅使用最终定义的。使用启动容器时

  • 我很困惑什么时候应该使用和。例如,要执行bash/shell命令(即),我将始终使用,或者是否存在使用的情况?试图理解关于这两个类似的指令的最佳实践。

  • 问题内容: 对于一个学校项目,我正在用Python制作子手游戏。现在,我的代码从字典中选择一个单词,如下所示: 现在,必须在运行之前在代码中设置单词列表,但是我添加了在运行时将单词添加到列表中的功能: 但是,一旦退出代码,显然不会保存添加的单词,因此,我将不得不手动将所有单词添加到列表中,或者每次代码启动后都将一堆单词添加到列表中。所以我想知道是否有一种简单的方法可以在代码完成后保存变量,以便Wo