Разница между && и `set -ex` в Dockerfiles - PullRequest
0 голосов
/ 13 мая 2018

В Dockerfiles я привык видеть этот шаблон (также изложенный в Рекомендации Docker ):

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 голосов
/ 13 мая 2018

Это не только для Docker; это просто обычный синтаксис оболочки, используемый в команде RUN. 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 был "охранен" &&, предшествующим ему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...