如果您有两个 ruby 进程,听起来孩子还没有退出,应用程序刚刚停止工作。EventMachine 反应器很可能就在后台。
EDI 应用程序真的需要生成额外的 Ruby 进程吗?这只会在 Docker 和您的应用程序之间添加另一层。直接运行服务器CMD [ "ruby", "boot.rb" ]
。如果您发现问题仍然存在于单个进程中,那么您将需要找出导致您的应用程序挂起的原因。
当一个进程作为 PID 1 是 docker 运行时,它也需要处理SIGINT
和SIGTERM
信号。
# Trap ^C
Signal.trap("INT") {
shut_down
exit
}
# Trap `Kill `
Signal.trap("TERM") {
shut_down
exit
}
Docker 还具有针对容器实际死亡时间的重启策略。
docker run --restart=always
no
容器退出时不要自动重启。这是默认设置。
on-failure[:max-retries]
仅当容器以非零退出状态退出时才重新启动。(可选)限制 Docker 守护程序尝试重新启动的次数。
always
无论退出状态如何,始终重新启动容器。当您指定 always 时,Docker 守护程序将尝试无限期地重新启动容器。无论容器的当前状态如何,容器也将始终在守护程序启动时启动。
unless-stopped
无论退出状态如何,始终重新启动容器,但如果容器之前已进入停止状态,则不要在守护进程启动时启动它。