為什么我的容器沒有運行?
回答這個問題需要知道 Docker 容器為什么退出,退出碼會提示容器停止運行的情況。本文列出了最常見的退出碼,來回答兩個重要問題:
這些退出碼是什么意思?
導致該退出碼的動作是什么?
exit code:代表一個進程的返回碼,通過系統(tǒng)調(diào)用 exit_group 來觸發(fā)。在 POSIX 中,0 代表正常的返回碼,而 1-255 代表異常返回碼,不過一般錯誤碼都是 1。這里有一張附表 Appendix E. Exit Codes With Special Meanings
如何查看退出碼
方法一:查看 pod 中的容器退出碼
$kubectldescribepodxxx
方法二:用 Docker 查看
$ dockerps--filter"status=exited" $ dockerinspect--format='{{.State.ExitCode}}'
方法三:手動輸出
$ dockercontainerrunalpinesh-c"exit1" $dockercontainerls-a CONTAINERIDIMAGECOMMANDCREATEDSTATUS 61c688005b3aalpine"sh-c'exit1'"AboutaminuteagoExited(1)3secondsago
常見退出碼
Exit Code 0
退出代碼0表示特定容器沒有附加前臺進程。
該退出代碼是所有其他后續(xù)退出代碼的例外。
這不一定意味著發(fā)生了不好的事情。如果開發(fā)人員想要在容器完成其工作后自動停止其容器,則使用此退出代碼。
如果你執(zhí)行 docker run hello-world, 你會得到“Hello from docker!”,但查看容器的時候docker ps -a | grep hello-world,會發(fā)現(xiàn)狀態(tài)碼為 0
Exit Code 1
程序錯誤,或者 Dockerfile 中引用不存在的文件,如 entrypoint 中引用了錯誤的包
程序錯誤可以很簡單,例如 “除以0”,也可以很復雜,比如空引用或者其他程序 crash
Exit Code 137
表明容器收到了 SIGKILL 信號,進程被殺掉,對應 kill -9
引發(fā) SIGKILL 的是 Docker Kill。這可以由用戶或由 Docker 守護程序來發(fā)起,手動執(zhí)行:docker kill
137 比較常見,如果 pod 中的 limit 資源設置較小,會運行內(nèi)存不足導致 OOMKilled,此時 state 中的 "OOMKilled" 值為 true,你可以在系統(tǒng)的 dmesg 中看到 oom 日志
Exit Code 139
表明容器收到了 SIGSEGV 信號,無效的內(nèi)存引用,對應 kill -11
一般是代碼有問題,或者 docker 的基礎鏡像有問題
Exit Code 143
表明容器收到了 SIGTERM 信號,終端關閉,對應 kill -15
一般對應 docker stop 命令
有時 docker stop 也會導致 Exit Code 137。發(fā)生在與代碼無法處理 SIGTERM 的情況下,docker 進程等待十秒鐘然后發(fā)出 SIGKILL 強制退出。
不常用的一些 Exit Code
Exit Code 126: 權限問題或命令不可執(zhí)行
Exit Code 127: Shell 腳本中可能出現(xiàn)錯字且字符無法識別的情況
Exit Code 1 或 255:因為很多程序員寫異常退出時習慣用 exit(1) 或 exit(-1),-1 會根據(jù)轉換規(guī)則轉成 255。這個一般是自定義 code,要看具體邏輯。
退出狀態(tài)碼的區(qū)間
必須在 0-255 之間,0 表示正常退出
外界將程序中斷退出,狀態(tài)碼在 129-255
程序自身異常退出,狀態(tài)碼一般在 1-128
假如寫代碼指定的退出狀態(tài)碼時不在 0-255 之間,例如: exit(-1),這時會自動做一個轉換,最終呈現(xiàn)的狀態(tài)碼還是會在 0-255 之間。我們把狀態(tài)碼記為 code,當指定的退出時狀態(tài)碼為負數(shù),那么轉換公式如下:256 – (|code| % 256)
審核編輯:劉清
-
Docker
+關注
關注
0文章
458瀏覽量
11857 -
docker容器
+關注
關注
0文章
30瀏覽量
3326
發(fā)布評論請先 登錄
相關推薦
評論