【发布时间】:2018-05-04 07:31:16
【问题描述】:
如果 Ruby 收到 TERM 信号,它通常会以退出代码 143 退出,根据this source,这表明进程成功响应了该信号。但是如果我让脚本在没有 shell 的情况下运行,退出代码是 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,而是shell?
【问题讨论】:
-
term_shell和term_exit是什么? -
Docker 镜像使用
docker run命令上方的 Dockerfile 构建。
标签: ruby docker signals exit exit-code