3.docker自動退出,分析
阿新 • • 發佈:2021-10-13
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)