docker常見退出碼
Exit Code 0
退出代碼0表示特定容器沒有附加前台進程。
該退出代碼是所有其他后續退出代碼的例外。
這不一定意味着發生了不好的事情。如果開發人員想要在容器完成其工作后自動停止其容器,則使用此退出代碼。
Exit Code 1
程序錯誤,或者Dockerfile中引用不存在的文件,如 entrypoint中引用了錯誤的包
程序錯誤可以很簡單,例如“除以0”,也可以很復雜,比如空引用或者其他程序 crash
Exit Code 137
此狀態碼一般是因為 pod 中容器內存達到了它的資源限制(resources.limits),一般是內存溢出(OOM),CPU達到限制只需要不分時間片給程序就可以。因為限制資源是通過 linux 的 cgroup 實現的,所以 cgroup 會將此容器強制殺掉,類似於 kill -9
還可能是宿主機本身資源不夠用了(OOM),內核會選取一些進程殺掉來釋放內存
不管是 cgroup 限制殺掉進程還是因為節點機器本身資源不夠導致進程死掉,都可以從系統日志中找到記錄( journalctl -k )
表明容器收到了 SIGKILL 信號,進程被殺掉,對應kill -9
引發SIGKILL的是docker kill。這可以由用戶或由docker守護程序來發起,手動執行:docker kill
137 比較常見,如果 pod 中的limit 資源設置較小,會運行內存不足導致 OOMKilled,此時state 中的 ”OOMKilled” 值為true,你可以在系統的 dmesg -T 中看到 oom 日志
Exit Code 139
表明容器收到了SIGSEGV信號,無效的內存引用,對應kill -11
一般是代碼有問題,或者 docker 的基礎鏡像有問題
Exit Code 143
表明容器收到了SIGTERM信號,終端關閉,對應kill -15
一般對應docker stop 命令
有時docker stop也會導致Exit Code 137。發生在與代碼無法處理SIGTERM的情況下,docker進程等待十秒鍾然后發出SIGKILL強制退出。
Exit Code 1 和 255
這種可能是一般錯誤,具體錯誤原因只能看容器日志,因為很多程序員寫異常退出時習慣用 exit(1) 或 exit(-1),-1 會根據轉換規則轉成 255
