&&和和Dockerfiles中的`set -ex`

时间:2018-05-13 18:45:21

标签: bash docker dockerfile

在Dockerfiles中,我习惯于看到这种模式(也在Docker's best practices中说明):

RUN apt-get update \
    && apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/*

最近,我经常遇到这样的模式:

RUN set -ex; \
    apt-get update; \
    apt-get install -y curl; \
    rm -rf /var/lib/apt/lists/*

我想知道区别是什么。我试过这个:

$ (echo one; exit 0) && (echo two; exit 0)
one
two

$ (echo one; exit 1) && (echo two; exit 0)
one

$ (echo one; exit 1) ; (echo two; exit 0)
one
two

$ set -ex; (echo one; exit 1) ; (echo two; exit 0)
:bomb: boots me from the session :)

因此似乎存在差异,但我不确定它是什么以及它在Dockerfiles的上下文中是否重要。

相关(但没有真正回答这个问题):

1 个答案:

答案 0 :(得分:3)

这不是Docker特有的;它只是RUN命令中使用的常规shell语法。如果任何命令失败,set -e会导致脚本退出,而如果左侧命令没有失败,则&&仅运行其右侧命令。所以在两者中

set -e
foo
bar

foo && bar

bar只会在foo成功时运行。

因此,两者是相同的如果整个脚本由单个列表命令... && ... && ...组成,其中命令仅在每个先前命令成功时运行。他们将如何区别的一个例子:

set -e
echo one
false
echo two
echo three

此处,echo twoecho three永远不会运行。但是在

echo one && false && echo two
echo three

echo three仍然可以投放,因为只有echo two被其前面的&&“保护”。