在dockerfile中,RUN和bash脚本有什么区别?

我已经看到许多dockerfiles包含RUN语句中的所有构build步骤,如:

RUN echo "Hello" && cd /tmp && mv a.txt b.txt && ... and so on... 

我的问题是:用单个bash脚本replace这些指令有什么好处/缺点,这使我能够突出语法,循环function等? 就像是:

 COPY ./script.sh /tmp RUN bash /tmp/script.sh 

接着

 #!/bin/bash echo "hello" ; cd /tmp ; mv a.txt b.txt ; ... 

谢谢!

主要区别在于,当您将bash脚本COPY到映像中时,它将在正在运行的容器中可用于检查,而RUN命令则更加不透明。 把你的命令放在这样一个文件中可以说是更易于pipe理的:其他的原因是:你的VCS历史logging的变化会更清晰一些,对于更长或更复杂的脚本,你可能会发现,单独的文件,而不是在RUN命令中embeddedDockerfile中。

否则结果是一样的(在这两种情况下,你都在执行相同的一组命令),虽然COPYRUN会产生一个额外的图像层(而不是自己的RUN )。

我想运行它作为一个shell脚本给你更多的控制。

例如,您可以执行if-else语句来检查命令是否失败,并提供一个代码path来处理它。 而RUN更直接,当返回代码不是0时,立即失败。

很明显,你在那里的情况是比较简单的,不会有太大的差别。 我能看到的唯一影响是代码可读性方面。 有人必须阅读shell script才能知道发生了什么事情,比较一下所有文件。

我想这一切都归结为正确的工作使用正确的工具。 如果它是一个简单的命令,并且不需要复杂的逻辑处理,则执行RUN