【问题标题】:Difference between && and `set -ex` in DockerfilesDockerfiles 中 && 和 `set -ex` 的区别
【发布时间】:2018-05-13 18:45:20
【问题描述】:

在 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 的上下文中是否重要。

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

【问题讨论】:

    标签: bash docker dockerfile


    【解决方案1】:

    这不是 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 被前面的 &&“保护”。

    【讨论】:

    • 谢谢。您是否看到在 Dockerfiles 的上下文中一种方法或另一种方法会“更好”的任何原因?我很确定我见过的一些 Dockerfile 已经从 && 语法重写为 set -ex
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 2013-08-12
    • 2012-05-13
    • 1970-01-01
    • 2018-09-29
    • 2011-01-24
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多