AWS 上 Node 应用程序的 Docker 退出状态 1



我正在使用 Express.js、Node、mongoose 和 docker 在 AWS 上托管一个测试版应用程序。每日活跃用户<10个,主要是我的朋友进行测试。由于某种原因,该应用程序几乎每天都会关闭。最初我认为这是 AWS 的问题,所以我停止了我的应用程序,将其从免费层更改为 t2.medium,然后重新启动它。

它没有解决问题,我检查了容器的 docker 日志。它不是由OOMKilled引起的。

"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 1,
"Error": "",
"StartedAt": "2017-03-22T00:51:59.234643501Z",
"FinishedAt": "2017-03-22T07:21:41.351927073Z"
},
"Config": {
...
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
...
}

我可以将 docker 设置为始终重新启动,但我想找出它的根本原因是什么。有什么建议吗?

这种情况发生在每个人身上。 很多事情都可以杀死Express应用程序,比如奇怪的HTTP请求。 Docker 日志应显示异常。 添加未捕获的异常处理程序以记录问题。

process.on('uncaughtException', (e) => {
console.error(e); // try console.log if that doesn't work
process.exit(10);
});

如果在 Docker日志中找不到错误,那么也许您可以记录到一个文件,而不是记录到控制台(确保它位于 Docker 运行之间的卷中)。

人们不喜欢承认这一点,但许多应用程序实际上只是记录异常并吃掉它,然后继续进入uncaughtException处理程序而不退出。 因为诸如损坏的请求或其他无关紧要的东西通常会杀死服务器,因此您通常可以侥幸逃脱。 但是偶尔你会被服务器状态发生的一些奇怪的事情烧毁,它无法从中恢复,你不知道,因为你刚刚吃了异常。

您可以让它自动重新启动应用程序 https://docs.docker.com/docker-cloud/apps/autorestart/这可能是一个不错的解决方案。

否则,如果可能的话,请查看将pm2与Docker一起使用的示例,pm2将为您处理重新启动。

最新更新