Если Ruby получает сигнал TERM, он обычно выходит с кодом выхода 143, который в соответствии с этим источником указывает, что процесс успешно ответил на этот сигнал. Но если я заставлю скрипт работать без оболочки, код выхода будет 1.
С оболочкой:
> cat Dockerfile
FROM ruby:alpine
CMD ruby -e "Process.kill('TERM', Process.pid)" # <- shell form
> docker build -t term_shell . > /dev/null
> docker run term_shell
Terminated
> echo $?
143
без оболочки:
> cat Dockerfile
FROM ruby:alpine
CMD ["ruby", "-e", "Process.kill('TERM', Process.pid)"] # <- exec form
> docker build -t term_exec . > /dev/null
> docker run term_exec
> echo $?
1
Но если я выйду из себя с помощью 143, код выхода будет таким, как ожидалось:
> cat Dockerfile
FROM ruby:alpine
CMD ["ruby", "-e", "exit(143)"] # <- exec form
> docker build -t exit_exec . > /dev/null
> docker run exit_exec
> echo $?
143
Почему это? Код выхода, когда ruby получает TERM, приходит не от Ruby, а от оболочки?