在Dockerfile中,“set -x”是做什么的?

我从现有的Dockerfile学习开始创build我自己的Dockerfile 。 我注意到大多数时候,命令都是以任一个开始的

 RUN set -x ... 

要么

 RUN set -ex; ... 

为什么这样做,为什么这是必要的? 有必要吗?

-e导致命令停止任何错误。 更典型的语法是用&&分隔命令以停止任何错误。

-x使shell输出每个正在运行的命令。 这对debugging脚本很有用。

从bash手册页下:

-e如果一个stream水线(可能包含一个简单的命令),一个列表或一个复合命令(见上面的SHELL GRAMMAR),立即退出,并以非零状态退出。 如果失败的命令是命令列表的一部分,紧接着if或elif保留字,在&&或||中执行的任何命令的一部分,紧接着一段时间或关键字之后,shell不会退出。 列表,除了最后的&&或||之后的命令,pipe道中的最后一个,或者命令的返回值与!相反的命令。 如果复合命令以外的子shell返回非零状态,因为命令失败,而-e被忽略,shell不会退出。 如果设置了ERR,则会在shell退出之前执行陷阱。 此选项分别适用于shell环境和每个子shell环境(请参阅上面的命令执行环境),并且可能会导致子shell在子shell中执行所有命令之前退出。

如果复合命令或shell函数在忽略-e的上下文中执行,则复合命令或函数体内执行的任何命令都不会受到-e设置的影响,即使-e已设置且命令返回失败状态。 如果复合命令或shell函数在-e被忽略的上下文中执行时设置-e,那么在复合命令或包含函数调用的命令完成之前,该设置将不起作用。

-x扩展每个简单命令后,对于command,case命令,select命令或arithmetic for命令,显示PS4的扩展值,后跟命令及其扩展参数或关联的单词列表。