在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中。
否则结果是一样的(在这两种情况下,你都在执行相同的一组命令),虽然COPY
和RUN
会产生一个额外的图像层(而不是自己的RUN
)。
我想运行它作为一个shell
脚本给你更多的控制。
例如,您可以执行if-else
语句来检查命令是否失败,并提供一个代码path来处理它。 而RUN
更直接,当返回代码不是0
时,立即失败。
很明显,你在那里的情况是比较简单的,不会有太大的差别。 我能看到的唯一影响是代码可读性方面。 有人必须阅读shell script
才能知道发生了什么事情,比较一下所有文件。
我想这一切都归结为正确的工作使用正确的工具。 如果它是一个简单的命令,并且不需要复杂的逻辑处理,则执行RUN
。