как изящно отсоединить докер бесконечного сна и почему - PullRequest
1 голос
/ 14 октября 2019

1) Я запускаю следующую команду для запуска контейнера:

docker run -d ubuntu /bin/bash -c 'while true; do echo hello world; sleep 1; done;'

2) Я присоединяюсь к нему с помощью следующей команды.

docker attach xxxx

3) Я не могу отсоединить его с помощьюctrl +c или ctrl +p ctrl+q последовательность.

Интересно, как выйти и почему ctrl + c не работает. Спасибо.

1 Ответ

1 голос
/ 15 октября 2019

Сценарий 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 последовательность клавиш

.

...