"set -x"在Dockerfile中做了什么?

Fra*_*hey 14 docker

我正在从现有Dockerfile的学习中开始创建自己的Dockerfile.我注意到大多数时候,命令都是从两个开始的

RUN set -x ...
Run Code Online (Sandbox Code Playgroud)

要么

RUN set -ex; ...
Run Code Online (Sandbox Code Playgroud)

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

BMi*_*tch 19

-e导致该命令停止对任何错误.更典型的语法是将命令分开&&以停止任何错误.

-x原因壳,以输出每个命令正在运行.这对于调试脚本很有用.

从bash手册页下set:

-e如果管道(可能包含单个简单命令),列表或复合命令(参见上面的SHELL GRAMMAR),则立即退出,退出时为非零状态.如果失败的命令是紧跟在while或until关键字之后的命令列表的一部分,在if或elif保留字之后的测试的一部分,在&&或||中执行的任何命令的一部分,则shell不会退出 list除了最后的&&或||之后的命令,管道中的任何命令但是最后一个命令,或者命令的返回值是否被反转!如果子shell以外的复合命令返回非零状态,因为在忽略-e时命令失败,则shell不会退出.ERR上的陷阱(如果已设置)将在shell退出之前执行.此选项分别适用于shell环境和每个子shell环境(请参阅上面的COMMAND EXECUTION ENVIRONMENT),并且可能会导致子shell在执行子shell中的所有命令之前退出.

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

...

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