2017-03-29 50 views
1

我在AWS上使用Express.js,Node,mongoose和docker託管測試版應用程序。日常活躍用戶< 10,主要是我的朋友進行測試。由於某種原因,該應用程序幾乎每天都停機。起初我以爲這是AWS的問題,所以我停止了我的應用程序,將它從免費層更改爲t2.medium並再次啓動它。AWS上的Node應用程序的Docker退出狀態1

它沒有解決問題,我檢查了容器的碼頭日誌。這不是由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, 
     ... 
    } 

我可以設置泊塢窗總是重啓,但我想弄清楚什麼是它的根本原因。有什麼建議麼?

回答

0

發生在每個人身上。許多事情可能導致快速應用程序中斷,比如奇怪的HTTP請求。 Docker日誌應該顯示異常。添加一個uncaughtException處理程序來記錄問題。

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

如果你不能找到在泊塢日誌中的錯誤,然後,而不是登錄到控制檯,也許你可以登錄到一個文件中(請確保它是在碼頭工人之間保持一個容量運行雖然) 。

人們不喜歡承認這一點,但許多應用程序實際上只是記錄異常並吃掉它,並繼續進入uncaughtException處理程序而不退出。因爲像破碎的請求或其他無關緊要的東西經常會導致服務器死機,所以通常可以避免這種情況。但是偶爾你會被服務器狀態發生的一些奇怪事情所灼傷,它無法從中恢復,而且你不知道,因爲你只是吃了一個例外。

您可以讓它自動啓動應用程序https://docs.docker.com/docker-cloud/apps/autorestart/,這可能是一個很好的解決方案。

否則請查看使用pm2和Docker(如果可能)的示例,pm2將爲您處理重新啓動。