Подтвердить что ты не робот

Что задает -e и exec "$ @" для сценариев входа в докер?

Я заметил, что многие скрипты entrypoint.sh для docker делают что-то вроде этого:

#!/bin/bash
set -e

... code ...

exec "[email protected]"

Каковы set -e и exec "[email protected]" для?

4b9b3361

Ответ 1

В основном он принимает все дополнительные аргументы командной строки и выполняет их как команду. Цель состоит в основном "Сделать все в этом .sh script, а затем в той же оболочке запустить команду, которую пользователь переходит в командной строке".

Смотрите:

Ответ 2

set -e - выйти script, если какая-либо команда завершится с ошибкой (отличное от нуля)

exec "[email protected]" - перенаправляет входные переменные, подробнее здесь

Ответ 3

set -e устанавливает параметр оболочки для немедленного выхода, если какая-либо команда запускается с ненулевым кодом выхода. script вернется с кодом выхода команды сбоя. На странице bash man:

set -e:

Выйти немедленно, если конвейер (который может состоять из простой простой команды), список или составную команду (см. SHELL GRAMMAR выше), выходы с ненулевым статусом. Оболочка не выходит если неудавшаяся команда является частью списка команд сразу через некоторое время или до ключевого слова, часть теста, следующего за if или elif зарезервированные слова, часть любой команды, выполненной в && & или || список, за исключением команды, следующей за окончательным && или ||, любой команда в конвейере, но последняя, ​​или если значение возвращаемой команды инвертируется с!. Если составная команда, отличная от подоболочки возвращает ненулевой статус, потому что команда была неудачной, а -e была игнорируется, оболочка не выходит. Ловушка при ERR, если установлена, выполняется до выхода оболочки. Этот параметр применяется к среде оболочки и каждой средой подоболочки отдельно (см. КОМАНДНОЕ ИСПОЛНЕНИЕ ОКРУЖАЮЩАЯ СРЕДА выше) и может вызывать подоболочки для выхода до выполнения все команды в подоболочке.

Если составная команда или функция оболочки выполняются в контексте, где -e игнорируется, ни одна из команд, выполняемых в составной команде или корпусе функции, не будет затронута параметром -e, даже если -e, и команда возвращает статус сбоя. Если составная команда или функция оболочки задают -e при выполнении в контексте, где -e игнорируется, эта настройка не будет иметь никакого эффекта до тех пор, пока составная команда или команда, содержащая вызов функции завершается.


exec "[email protected]" обычно используется для того, чтобы пропустить входную точку, а затем запускает команду докера. Он заменит текущую рабочую оболочку командой, на которую указывает "[email protected]". По умолчанию эта переменная указывает на аргументы командной строки.

Если у вас есть изображение с точкой входа, указывающей на entrypoint.sh, и вы запускаете свой контейнер как docker run my_image server start, который будет транслировать на запуск entrypoint.sh server start в контейнере. В строке exec entrypoint.sh оболочка, работающая как pid 1, заменит себя командой server start.

Это важно для обработки сигналов. Без использования exec server start в приведенном выше примере будет выполняться как еще один pid, и после его завершения вы вернетесь в свою оболочку script. С оболочкой в ​​pid 1 по умолчанию игнорируется SIGTERM. Это означает, что градиентный сигнал остановки, который docker stop отправляет в ваш контейнер, никогда не будет принят процессом server. Через 10 секунд (по умолчанию) docker stop откажется от изящного завершения работы и отправит SIGKILL, который заставит ваше приложение выйти, но с потенциальной потерей данных или закрытыми сетевыми подключениями разработчики приложений могли бы закодировать, если они получили сигнал. Это также означает, что ваш контейнер всегда будет останавливаться на 10 секунд.

Обратите внимание, что с командами оболочки, такими как shift и set --, вы можете изменить значение "[email protected]". Например. здесь короткая часть script, которая удаляет /bin/sh -c "..." из команды, которая может появиться, если вы используете синтаксис оболочки docker для CMD:

# convert `/bin/sh -c "server start"` to `server start`
if [ $# -gt 1 ] && [ x"$1" = x"/bin/sh" ] && [ x"$2" = x"-c" ]; then
  shift 2
  eval "set -- $1"
fi

....

exec "[email protected]"