Лучшее решение, которое я нашел, это 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
вручную.