Есть bash-скрипт, который запускает чего-то там в background и дальше делает sleep 100000d
. Смысл в том, что юзер жмет ctrl+c, скрипт завершает выполнение и фоновые процессы прибиваются.
В докере это не работает. На ctrl+c реакции нет, stop не останавливает (ну точней останавливает тупо прибивая, когда таймаут выходит).
Пробовал: trap, trap с короткими sleep в цикле, trap с sleep в фоне и wait.
Последняя попытка:
trap 'echo trap 0' 0
trap 'echo trap 1' 1
trap 'echo trap 2' 2
trap 'echo trap 3' 3
trap 'echo trap 13' 13
trap 'echo trap 15' 15
trap 'echo trap INT' INT
trap 'echo trap STOP' STOP
trap 'echo trap TERM' TERM
# trap 'jobs -p | xargs --no-run-if-empty kill' STOP
# sleep 100000d || true
sleep 1 &
while wait $!
do
sleep 1 &
done
Ничего не работает. Как это правильно сделать?
Т.е. если упростить, то:
test.sh:
#!/bin/sh -eu
trap 'echo trap INT' INT
sleep 100000d || true
Dockerfile
FROM node:16
WORKDIR /root
COPY test.sh .
CMD ./test.sh
docker build -t test .
docker run --rm --name test test
Тут надо, чтобы он на Ctrl+C среагировал, напечатав что-нибудь и остановившись. Или на docker stop test
в соседней вкладке. Хотя кажется это одно и то же.
Запускать docker run -t не предлагать. Оно должно в конечном итоге работать как сервис.