解決Docker容器異常退出Exit(253)問題
容器異常退出,狀態(tài)碼為253
我遇到的情況為容器內(nèi)掛載到docker卷的目錄不存在,導(dǎo)致掛載失敗,容器異常退出
具體場景
使用rocketmq官方工具制作指定版本鏡像,使用docker-compose啟動nameSrv1+MasterBroker1+SlaveBroker*1,將broker的日志目錄和存儲目錄掛載在docker卷上,具體docker-compose如下。
version: '2' services: ? ? mq_nsrv: ? ? ? ? image: apacherocketmq/rocketmq:4.3.1 ? ? ? ? container_name: rocketmq_namesrv ? ? ? ? ports: ? ? ? ? ? ? - 9876:9876 ? ? ? ? volumes: ? ? ? ? ? ? - mq_nsrv:/home/rocketmq/logs ? ? ? ? ? ? - /etc/localtime:/etc/localtime ? ? ? ? ? ? - /etc/timezone:/etc/timezone ? ? ? ? command: sh mqnamesrv ? ? ? ? networks: ? ? ? ? ? ? - mq_net ? ? mq_broker_m: ? ? ? ? image: apacherocketmq/rocketmq:4.3.1 ? ? ? ? container_name: rocketmq_broker_m ? ? ? ? links: ? ? ? ? ? ? - mq_nsrv ? ? ? ? depends_on: ? ? ? ? ? ? - mq_nsrv ? ? ? ? environment: ? ? ? ? ? ? JAVA_OPTS: " -Duser.home=/opt -Dlogging.level.root=info" ? ? ? ? ? ? JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m" ? ? ? ? ports: ? ? ? ? ? ? - 10909:10909 ? ? ? ? ? ? - 10911:10911 ? ? ? ? ? ? - 10912:10912 ? ? ? ? volumes: ? ? ? ? ? ? - /etc/localtime:/etc/localtime ? ? ? ? ? ? - /etc/timezone:/etc/timezone ? ? ? ? ? ? - master_broker_log:/home/rocketmq/log ? ? ? ? ? ? - master_broker_store:/home/rocketmq/store ? ? ? ? ? ? - ./broker_m.conf:/opt/rocketmq-4.3.1/conf/broker.conf ? ? ? ? command: sh mqbroker -c /opt/rocketmq-4.3.1/conf/broker.conf ? ? ? ? networks: ? ? ? ? ? ? - mq_net ? ? mq_broker_s: ? ? ? ? image: apacherocketmq/rocketmq:4.3.1 ? ? ? ? container_name: rocketmq_broker_s ? ? ? ? links: ? ? ? ? ? ? - mq_nsrv ? ? ? ? depends_on: ? ? ? ? ? ? - mq_nsrv ? ? ? ? environment: ? ? ? ? ? ? JAVA_OPTS: " -Duser.home=/opt -Dlogging.level.root=info" ? ? ? ? ? ? JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m" ? ? ? ? ports: ? ? ? ? ? ? - 11909:10909 ? ? ? ? ? ? - 11911:10911 ? ? ? ? ? ? - 11912:10912 ? ? ? ? volumes: ? ? ? ? ? ? - /etc/localtime:/etc/localtime ? ? ? ? ? ? - /etc/timezone:/etc/timezone ? ? ? ? ? ? - slave_broker_log:/home/rocketmq/log ? ? ? ? ? ? - slave_broker_store:/home/rocketmq/store ? ? ? ? ? ? - ./broker_s.conf:/opt/rocketmq-4.3.1/conf/broker.conf ? ? ? ? command: sh mqbroker -c /opt/rocketmq-4.3.1/conf/broker.conf ? ? ? ? networks: ? ? ? ? ? ? - mq_net volumes: ? ? mq_nsrv: ? ? ? ? driver: local ? ? master_broker_log: ? ? ? ? driver: local ? ? master_broker_store: ? ? ? ? driver: local ? ? slave_broker_log: ? ? ? ? driver: local ? ? slave_broker_store: ? ? ? ? driver: local networks: ? ? mq_net: ? ? ? ? driver: bridge
原因分析
在此制作的鏡像中,/home/rocketmq/目錄下為空,在brocker運(yùn)行之后,生成/log和/store目錄,并對其中進(jìn)行寫入數(shù)據(jù),此時使用docker-compose啟動時,無法將卷掛載在/log和/store目錄下。
問題解決
重新制作鏡像,在指定目錄下創(chuàng)建目錄(從根本解決問題)
在掛載卷的時候,使用其根目錄掛載,不區(qū)分log和store卷,直接掛在/home/rocketmq下(省事)
附成功docker-compose
version: '2' services: ? ? mq_nsrv: ? ? ? ? image: apacherocketmq/rocketmq:4.3.1 ? ? ? ? container_name: rocketmq_namesrv ? ? ? ? ports: ? ? ? ? ? ? - 9876:9876 ? ? ? ? volumes: ? ? ? ? ? ? - mq_nsrv:/home/rocketmq/logs ? ? ? ? ? ? - /etc/localtime:/etc/localtime ? ? ? ? ? ? - /etc/timezone:/etc/timezone ? ? ? ? command: sh mqnamesrv ? ? ? ? networks: ? ? ? ? ? ? - mq_net ? ? mq_broker_m: ? ? ? ? image: apacherocketmq/rocketmq:4.3.1 ? ? ? ? container_name: rocketmq_broker_m ? ? ? ? links: ? ? ? ? ? ? - mq_nsrv ? ? ? ? depends_on: ? ? ? ? ? ? - mq_nsrv ? ? ? ? environment: ? ? ? ? ? ? JAVA_OPTS: " -Duser.home=/opt -Dlogging.level.root=info" ? ? ? ? ? ? JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m" ? ? ? ? ports: ? ? ? ? ? ? - 10909:10909 ? ? ? ? ? ? - 10911:10911 ? ? ? ? ? ? - 10912:10912 ? ? ? ? volumes: ? ? ? ? ? ? - /etc/localtime:/etc/localtime ? ? ? ? ? ? - /etc/timezone:/etc/timezone ? ? ? ? ? ? - master_broker:/home/rocketmq ? ? ? ? ? ? - ./broker_m.conf:/opt/rocketmq-4.3.1/conf/broker.conf ? ? ? ? command: sh mqbroker -c /opt/rocketmq-4.3.1/conf/broker.conf ? ? ? ? networks: ? ? ? ? ? ? - mq_net ? ? mq_broker_s: ? ? ? ? image: apacherocketmq/rocketmq:4.3.1 ? ? ? ? container_name: rocketmq_broker_s ? ? ? ? links: ? ? ? ? ? ? - mq_nsrv ? ? ? ? depends_on: ? ? ? ? ? ? - mq_nsrv ? ? ? ? environment: ? ? ? ? ? ? JAVA_OPTS: " -Duser.home=/opt -Dlogging.level.root=info" ? ? ? ? ? ? JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m" ? ? ? ? ports: ? ? ? ? ? ? - 11909:10909 ? ? ? ? ? ? - 11911:10911 ? ? ? ? ? ? - 11912:10912 ? ? ? ? volumes: ? ? ? ? ? ? - /etc/localtime:/etc/localtime ? ? ? ? ? ? - /etc/timezone:/etc/timezone ? ? ? ? ? ? - slave_broker:/home/rocketmq ? ? ? ? ? ? - ./broker_s.conf:/opt/rocketmq-4.3.1/conf/broker.conf ? ? ? ? command: sh mqbroker -c /opt/rocketmq-4.3.1/conf/broker.conf ? ? ? ? networks: ? ? ? ? ? ? - mq_net volumes: ? ? mq_nsrv: ? ? ? ? driver: local ? ? master_broker: ? ? ? ? driver: local ? ? slave_broker: ? ? ? ? driver: local networks: ? ? mq_net: ? ? ? ? driver: bridge
Docker容器退出狀態(tài)碼existed
在起容器的時候,發(fā)現(xiàn)容器出于existed狀態(tài),狀態(tài)碼為130,查找后發(fā)現(xiàn),自己啟動的時候使用了非后臺啟動。當(dāng)手動 ctrl+C 退出命令行的時候,容器也就退出了。
開始的時候,不知道狀態(tài)碼含義,糾結(jié)了很久,于是把一些狀態(tài)碼的含義搜羅了一下。
- 首先狀態(tài)碼必須在 0-255 之間
- 0 表示正常退出
- 外界中斷將程序退出的時候狀態(tài)碼區(qū)間在 129-255,(操作系統(tǒng)給程序發(fā)送中斷信號,比如 kill -9 是 SIGKILL,ctrl+c 是 SIGINT)
- 一般程序自身原因?qū)е碌漠惓M顺鰻顟B(tài)區(qū)間在 1-128 (這只是一般約定,程序如果一定要用129-255的狀態(tài)碼也是可以的)
下圖為部分狀態(tài)碼:
常見的容器退出狀態(tài)碼解釋
Exit Code 0
退出代碼0表示特定容器沒有附加前臺進(jìn)程
該退出代碼是所有其他后續(xù)退出代碼的例外
這不一定意味著發(fā)生了不好的事情。如果開發(fā)人員想要在容器完成其工作后自動停止其容器,則使用此退出代碼。比如:kubernetes job 在執(zhí)行完任務(wù)后正常退出碼為 0
Exit Code 1
程序錯誤,或者Dockerfile中引用不存在的文件,如 entrypoint中引用了錯誤的包
程序錯誤可以很簡單,例如 “除以0”,也可以很復(fù)雜,比如空引用或者其他程序 crash
Exit Code 137
表明容器收到了 SIGKILL 信號,進(jìn)程被殺掉,對應(yīng)kill -9
引發(fā)SIGKILL的是docker kill。這可以由用戶或由docker守護(hù)程序來發(fā)起,手動執(zhí)行:docker kill
137 比較常見,如果 pod 中的limit 資源設(shè)置較小,會運(yùn)行內(nèi)存不足導(dǎo)致 OOMKilled,此時state 中的 ”OOMKilled” 值為true,你可以在系統(tǒng)的 dmesg -T 中看到 oom 日志
Exit Code 139
表明容器收到了 SIGSEGV 信號,無效的內(nèi)存引用,對應(yīng)kill -11
一般是代碼有問題,或者 docker 的基礎(chǔ)鏡像有問題
Exit Code 143
表明容器收到了 SIGTERM 信號,終端關(guān)閉,對應(yīng)kill -15
一般對應(yīng) docker stop 命令
有時docker stop也會導(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)錯字且字符無法識別的情況
Exit Code 1 或 255:因?yàn)楹芏喑绦騿T寫異常退出時習(xí)慣用 exit(1) 或 exit(-1),-1 會根據(jù)轉(zhuǎn)換規(guī)則轉(zhuǎn)成 255。這個一般是自定義 code,要看具體邏輯。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker一鍵部署SpringBoot項(xiàng)目的多種方式
這篇文章主要介紹了Docker一鍵部署SpringBoot項(xiàng)目的多種方式,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12Docker安裝MongoDB并使用Navicat連接的操作方法
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,MongoDB最大的特點(diǎn)是它支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,這篇文章主要介紹了Docker安裝MongoDB并使用Navicat連接,需要的朋友可以參考下2022-10-10Docker部署Laravel應(yīng)用的實(shí)現(xiàn)示例
這篇文章主要介紹了Docker部署Laravel應(yīng)用的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09使用docker?部署mysql突然連接不上的問題及解決方法
這篇文章主要介紹了使用docker?部署mysql,突然連接不上,要解決這個問題需要找到根本原因,對癥治療就好,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06