為什么我的容器沒有運(yùn)行?
回答這個(gè)問題需要知道 Docker 容器為什么退出,退出碼會(huì)提示容器停止運(yùn)行的情況。本文列出了最常見的退出碼,來回答兩個(gè)重要問題:
這些退出碼是什么意思?
導(dǎo)致該退出碼的動(dòng)作是什么?
exit code:代表一個(gè)進(jìn)程的返回碼,通過系統(tǒng)調(diào)用 exit_group 來觸發(fā)。在 POSIX 中,0 代表正常的返回碼,而 1-255 代表異常返回碼,不過一般錯(cuò)誤碼都是 1。這里有一張附表 Appendix E. Exit Codes With Special Meanings
如何查看退出碼
方法一:查看 pod 中的容器退出碼
$kubectldescribepodxxx
方法二:用 Docker 查看
$ dockerps--filter"status=exited" $ dockerinspect--format='{{.State.ExitCode}}'
方法三:手動(dòng)輸出
$ dockercontainerrunalpinesh-c"exit1" $dockercontainerls-a CONTAINERIDIMAGECOMMANDCREATEDSTATUS 61c688005b3aalpine"sh-c'exit1'"AboutaminuteagoExited(1)3secondsago
常見退出碼
Exit Code 0
退出代碼0表示特定容器沒有附加前臺(tái)進(jìn)程。
該退出代碼是所有其他后續(xù)退出代碼的例外。
這不一定意味著發(fā)生了不好的事情。如果開發(fā)人員想要在容器完成其工作后自動(dòng)停止其容器,則使用此退出代碼。
如果你執(zhí)行 docker run hello-world, 你會(huì)得到“Hello from docker!”,但查看容器的時(shí)候docker ps -a | grep hello-world,會(huì)發(fā)現(xiàn)狀態(tài)碼為 0
Exit Code 1
程序錯(cuò)誤,或者 Dockerfile 中引用不存在的文件,如 entrypoint 中引用了錯(cuò)誤的包
程序錯(cuò)誤可以很簡單,例如 “除以0”,也可以很復(fù)雜,比如空引用或者其他程序 crash
Exit Code 137
表明容器收到了 SIGKILL 信號(hào),進(jìn)程被殺掉,對(duì)應(yīng) kill -9
引發(fā) SIGKILL 的是 Docker Kill。這可以由用戶或由 Docker 守護(hù)程序來發(fā)起,手動(dòng)執(zhí)行:docker kill
137 比較常見,如果 pod 中的 limit 資源設(shè)置較小,會(huì)運(yùn)行內(nèi)存不足導(dǎo)致 OOMKilled,此時(shí) state 中的 "OOMKilled" 值為 true,你可以在系統(tǒng)的 dmesg 中看到 oom 日志
Exit Code 139
表明容器收到了 SIGSEGV 信號(hào),無效的內(nèi)存引用,對(duì)應(yīng) kill -11
一般是代碼有問題,或者 docker 的基礎(chǔ)鏡像有問題
Exit Code 143
表明容器收到了 SIGTERM 信號(hào),終端關(guān)閉,對(duì)應(yīng) kill -15
一般對(duì)應(yīng) docker stop 命令
有時(shí) docker stop 也會(huì)導(dǎo)致 Exit Code 137。發(fā)生在與代碼無法處理 SIGTERM 的情況下,docker 進(jìn)程等待十秒鐘然后發(fā)出 SIGKILL 強(qiáng)制退出。
不常用的一些 Exit Code
Exit Code 126: 權(quán)限問題或命令不可執(zhí)行
Exit Code 127: Shell 腳本中可能出現(xiàn)錯(cuò)字且字符無法識(shí)別的情況
Exit Code 1 或 255:因?yàn)楹芏?a href="http://www.zgszdi.cn/v/tag/1730/" target="_blank">程序員寫異常退出時(shí)習(xí)慣用 exit(1) 或 exit(-1),-1 會(huì)根據(jù)轉(zhuǎn)換規(guī)則轉(zhuǎn)成 255。這個(gè)一般是自定義 code,要看具體邏輯。
退出狀態(tài)碼的區(qū)間
必須在 0-255 之間,0 表示正常退出
外界將程序中斷退出,狀態(tài)碼在 129-255
程序自身異常退出,狀態(tài)碼一般在 1-128
假如寫代碼指定的退出狀態(tài)碼時(shí)不在 0-255 之間,例如: exit(-1),這時(shí)會(huì)自動(dòng)做一個(gè)轉(zhuǎn)換,最終呈現(xiàn)的狀態(tài)碼還是會(huì)在 0-255 之間。我們把狀態(tài)碼記為 code,當(dāng)指定的退出時(shí)狀態(tài)碼為負(fù)數(shù),那么轉(zhuǎn)換公式如下:256 – (|code| % 256)
-
程序
+關(guān)注
關(guān)注
117文章
3796瀏覽量
81420 -
容器
+關(guān)注
關(guān)注
0文章
499瀏覽量
22125 -
代碼
+關(guān)注
關(guān)注
30文章
4828瀏覽量
69063
原文標(biāo)題:理解 Docker 容器退出碼
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
常見新大陸二維碼掃描模組模塊型號(hào)有哪些?各有什么特點(diǎn)
![<b class='flag-5'>常見新大陸二維碼</b>掃描模組模塊型號(hào)有哪些?各有什么特點(diǎn)](https://file1.elecfans.com/web3/M00/05/66/wKgZPGd_feyAa_hKAADgGReXqic833.png)
關(guān)于如何解決MOS常見問題的方案參考
![關(guān)于如何解決MOS<b class='flag-5'>常見</b>問題的方案參考](https://file1.elecfans.com/web3/M00/00/E9/wKgZO2dOyeeAYuH9AAA6kc9aR4Y339.png)
無線智能遙控開關(guān)怎么對(duì)碼
生產(chǎn)線用條碼讀碼器介紹
![生產(chǎn)線用條碼讀<b class='flag-5'>碼</b>器<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/05/81/wKgaombQKDWAXlLHAABCT1zBc3E090.png)
新大陸掃碼器哪款能夠識(shí)別DPM碼?新大陸二維碼掃碼器介紹
![新大陸掃<b class='flag-5'>碼</b>器哪款能夠識(shí)別DPM<b class='flag-5'>碼</b>?新大陸二維<b class='flag-5'>碼</b>掃<b class='flag-5'>碼</b>器<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/00/05/wKgaomanOAeAbM3eAABMs4Wk-UQ408.png)
常見的變頻器故障碼及故障處理方法詳解
功能測(cè)試覆蓋中最常見的是什么方法
常見的光纖接口介紹
常見的網(wǎng)絡(luò)接口介紹
PCB板的顏色應(yīng)該怎么選?為什么綠色最常見?
![PCB板的顏色應(yīng)該怎么選?為什么綠色<b class='flag-5'>最常見</b>?](https://file.elecfans.com/web2/M00/3E/6A/pYYBAGJhBGGAGyDYAACBPQuBZQI711.png)
電子束光刻的參數(shù)優(yōu)化及常見問題介紹
![電子束光刻的參數(shù)優(yōu)化及<b class='flag-5'>常見</b>問題<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/C5/94/wKgaomX2jzaAd2rEAACe0uGc_GY680.jpg)
工業(yè)制造行業(yè)中的DPM碼識(shí)讀要如何選擇固定讀碼器?
![工業(yè)制造行業(yè)中的DPM<b class='flag-5'>碼</b>識(shí)讀要如何選擇固定讀<b class='flag-5'>碼</b>器?](https://file1.elecfans.com/web2/M00/C3/BC/wKgaomXoBK-AGhbRAADd0Rom3WI231.png)
評(píng)論