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

时间:2017-03-29 00:38:49

标签: node.js express docker amazon-ec2

我使用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设置为始终重启,但我想弄清楚它的根本原因是什么。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

每个人都会遇到这种情况。很多东西都可以杀死Express应用程序,就像奇怪的HTTP请求一样。 Docker日志应该显示异常。添加一个uncaughtException处理程序来记录问题。

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将为您重新启动。