Сценарий bash является основным процессом в контейнере и имеет PID 1
. Как объясняется в документах , процесс с PID 1
обрабатывается иначе, чем другие процессы:
Процесс, выполняющийся как PID 1 внутри контейнера, обрабатывается специально Linux: он игнорируетлюбой сигнал с действием по умолчанию. Таким образом, процесс не завершится на SIGINT или SIGTERM, если он не закодирован для этого.
Это означает, что скрипт должен перехватывать сигналы и что-то с ними делать. Чтобы заставить его выйти, объявите trap
:
docker run -d ubuntu /bin/bash -c 'trap exit INT TERM; while true; do echo hello world; sleep 1; done;'
Имейте в виду, что bash не будет обрабатывать какие-либо сигналы, пока не завершится процесс переднего плана (в данном случае sleep
). Поэтому будет задержка в зависимости от интервала ожидания и момента нажатия CTRL+C
. Чтобы немедленно выйти, sleep
должен быть прерван (см. sleep, wait и распространение Ctrl + C ):
docker run -d ubuntu /bin/bash -c 'trap exit INT TERM; while true; do echo hello world; sleep 1 & wait; done;'
Контейнер запускается с флагом -d
. Вы не можете отсоединить его, если не запустите его с помощью -it
.
Если контейнер был запущен с -i и -t, вы можете отсоединиться от контейнера и оставить его запущенным с помощью CTRL-p CTRL-q последовательность клавиш
.