node.js – docker stop对节点进程不起作用
我希望能够在docker容器中运行node,然后能够运行docker stop< container>.这应该在SIGTERM上停止容器,而不是超时并执行SIGKILL.不幸的是,我似乎错过了一些东西,我发现的信息似乎与其他部分相矛盾. 这是一个测试Dockerfile:
这是Dockerfile中引用的test.js:
我这样构建它:
我像这样运行它:
然后我跑:
因此,SIGTERM显然不起作用,导致它在10秒后超时,然后死亡. 我发现如果我通过sh -c启动节点任务,那么我可以从交互式(-it)容器中用^ C杀死它,但我仍然无法让docker停止工作.这与我读过的评论相矛盾,说sh不传递信号,但可能同意我读过的其他评论说PID 1没有得到SIGTERM(因为它是通过sh启动的,它将是PID 2). 最终目标是能够在upstart作业中运行docker start -a …并且能够停止服务并且它实际上退出容器. 最佳答案
好吧,我自己想出了一个解决方法,我会冒昧地回答,希望能帮助别人.它并没有完全回答为什么信号之前没有工作,但它确实给了我想要的行为.
使用baseimage-docker似乎解决了这个问题.以下是我使用上面的最小测试示例进行的操作: 保持test.js不变. 将Dockerfile修改为如下所示:
baseimage-docker包含一个init进程(/ sbin / my_init),它处理启动其他进程并处理zombie processes.它使用runit进行服务监督.因此,Dockerfile将my_init进程设置为在引导时运行的命令,并为runit添加脚本/ etc / service以获取它. run.sh脚本很简单:
别忘了chmod x run.sh! 默认情况下,如果服务出现故障,runit将自动重启服务. 按照这些步骤(以及之前的构建,运行和停止),容器会及时正确地响应其关闭请求. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- MVC5 + EF6 + Bootstrap3 (16) 客户端验证
- shell – 如何在END之前检测awk中的最后一行
- Bootstrapvalidator校验、校验清除重置的实现代码
- amazon-web-services – 如何设置自动扩展Rabbi
- angularjs – Angular-Strap错误:[$injector:u
- 字符串 – 从同一行读取多个输入Scala方式
- vim – 从quickfix窗口中打开项目,在垂直分割?
- 刚下载了Scala Lift聊天应用程序并使用说明运行它
- scala – 如何在生产中发展akka-persistence事件
- angularjs – Angular-Kendo日期格式行为