как запустить Docker, поддерживать Ctrl + C, а не объединять stderr - PullRequest
0 голосов
/ 30 января 2019

У меня есть куча сценариев, которые я запускаю внутри докеров.Они вызываются скриптами и не должны быть интерактивными.Внешние сценарии иногда запускаются в терминале, а иногда нет (как в CI).

Я хочу поддержать пользователей, убивающих сценарии с помощью Ctrl + C ,поэтому я в настоящее время передаю -t (--tty).Но я обнаружил, что эта опция сочетает в себе stdout и stderr.Я не хочу этого.

Есть ли способ, которым я могу поддержать Ctrl + C и по-прежнему иметь stderr?

1 Ответ

0 голосов
/ 23 февраля 2019

Лучшее решение, которое я нашел, это tini .В частности, добавьте следующее к Dockerfile:

ENV TINI_VERSION v0.18.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "-g", "--"]

Это взято в основном дословно из тини README, и добавляет -g, что делает Ctrl + C работает больше, чем вы ожидаете.

Теперь нет необходимости использовать --tty и не использовать stdout и stderr.

Как это работает?

tini Автор делает большую работу объясняя это .Подводя итог, докер запускает ваш процесс как PID 1. PID 1 обычно является init, и у него есть некоторые обязанности, например, обработка сигналов.bash, и большинство других программ, которые вы можете запустить в своем контейнере, не делают этого.tini делает, и это делает такую ​​хорошую работу, они добавили его к docker как --init.Единственная проблема с этим флагом заключается в том, что он не добавляет -g, что важно для сценариев оболочки.Поэтому я рекомендую добавить его в Dockerfile вручную.

...