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

9

我看到很多Dockerfile将所有构建步骤都包含在一个RUN语句中,比如:

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

我的问题是:用一个bash脚本替换这些指令有什么好处/坏处?脚本可以提供语法高亮、循环功能等等,类似于:

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

然后

#!/bin/bash

echo "hello" ;
cd /tmp ;
mv a.txt b.txt ;
...    

谢谢!

2个回答

6
主要区别是当你将bash脚本COPY到镜像中时,它将在运行容器中可供检查,而RUN命令则有点更加不透明。将命令放在文件中可能更易于管理,因为VCS历史中的更改将更清晰,对于较长或更复杂的脚本,您可能会发现将脚本格式整齐地放在单独的文件中而不是嵌入在Dockerfile的RUN命令中更容易。

否则结果是相同的(在两种情况下,您都将执行相同的一组命令),尽管COPYRUN将导致额外的镜像层(与仅使用RUN相比)。


1
执行完脚本文件后将其删除可能是一个好的做法,不是吗? - vbsessa
对于那个问题,我没有强烈的意见。通常情况下,我会保留脚本,但可以说它已经在你的资源中可用了,所以...你知道的,做出适合自己感觉的决定吧 :) - larsks
5
最后一个区别是,docker history命令不会显示在Shell脚本内部运行的命令,只会显示你运行了该脚本。 - BMitch

0

我猜作为一个shell脚本运行可以给你更多的控制。

例如,你可以使用if-else语句来检查命令是否失败,并提供处理它的代码路径。而RUN则更加直接,当返回代码不是0时,它会立即失败构建。

显然,你所面对的情况相对简单,不会有太大的区别。唯一的影响在于代码可读性方面。相比于将所有内容放在单个文件中,某人必须阅读shell脚本才能知道发生了什么。

我想这一切都归结于使用正确的工具来完成正确的工作。如果只是一个简单的命令,而且你不需要复杂的逻辑处理,那就使用RUN


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接