1. 程式人生 > 其它 >3.docker自動退出,分析

3.docker自動退出,分析

docker檢視退出碼指令

$ docker ps --filter "status=exited"
$ docker inspect  container-id --format='{{.State.ExitCode}}'
1
2
常見退出碼
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)
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
Exit Code 126: 許可權問題或命令不可執行
Exit Code 127: Shell指令碼中可能出現錯字且字元無法識別的情況
Exit Code 1 或 255:因為很多程式設計師寫異常退出時習慣用 exit(1) 或 exit(-1),-1 會根據轉換規則轉成 255。這個一般是自定義 code,要看具體邏輯。
退出狀態碼的區間
必須在 0-255 之間,0 表示正常退出
外界將程式中斷退出,狀態碼在 129-255
程式自身異常退出,狀態碼一般在 1-128
假如寫程式碼指定的退出狀態碼時不在 0-255 之間,例如: exit(-1),這時會自動做一個轉換,最終呈現的狀態碼還是會在 0-255 之間。我們把狀態碼記為 code,當指定的退出時狀態碼為負數,那麼轉換公式如下:256 – (|code| % 256)