在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的上下文中是否重要。
相关(但没有真正回答这个问题):
答案 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 two
和echo three
永远不会运行。但是在
echo one && false && echo two
echo three
echo three
仍然可以投放,因为只有echo two
被其前面的&&
“保护”。