初探docker(四)| docker容器退出码
本文主要介绍Docker容器退出状态码。
关键词:Docker
常见容器退出码解释
Exit 0
- 退出状态码表示特定容器没有附加前台进程
- 该状态码表示容器正常退出
- 某些情况下,容器中的进程成功捕获到了外部收到的信号,并成功进程了处理,此时容器退出的状态码也是0。
Exit 1
- 程序错误,例如Dockerfile引用了不存在的文件,如entrypoint引用了错误的包;
- 程序错误可以很简单比如除以0,也可很复杂比如空引用和其他程序crash;
Exit 137
- 表明容器收到了
SIGKILL
信号,表示进程被杀掉,对应kill -9
; - 引发
SIGKILL
的通常是用户手动执行的docker kill
或者由docker守护进程发起的; - 在k8s中,如果Pod的limit资源设置比较小,引发运行内存不足导致
OOMKillered
,此时state
的OOMKilled
设置为true
。通过dmesg -T
也可看到oom日志
Exit 139
- 表明容器收到了
SIGENV
信号,表示无效的内存引用,对应kill -11
; - 一般是代码或者基础镜像有问题
Exit 143
- 表明容器收到了
SIGTERM
信号,表示终端被关闭,对应kill -15
; - 引发
SIGTERM
一般对应用户手动执行docker stop
或者由docker守护进程发起的; - 有时
docker stop
命令也可能会导致Exit 137。在发生代码无法处理SIGTERM
的情况下,docker守护进程等待10秒钟后发出SIGKILL
强制退出。
不常用的一些 Exit Code
Exit 126
: 权限问题或命令不可执行Exit 127
: Shell脚本中可能出现错字且字符无法识别的情况Exit 1 或 255
:因为很多程序员写异常退出时习惯用 exit(1) 或 exit(-1),-1 会根据转换规则转成 255。这个一般是自定义 code,要看具体逻辑。
附录:具有特殊含义的退出代码
退出状态代码 | 含义 | 例子 | 解释 |
---|---|---|---|
1 | 捕获一般错误 | let "var1 = 1 / 0" | 各种各样的错误,例如“除以零”和其他不允许的操作 |
2 | 滥用shell内置函数(根据bash文档) | empty_function() {} | 缺少关键字或命令,或权限问题(以及二进制文件比较失败的差异返回代码) |
126 | 调用的命令无法执行 | /dev/null | 权限问题或命令不是可执行文件 |
127 | 调用的命令找不到 | illegal_command | \(PATH 拼写错误或者可能有问题 | | 128 | 退出参数无效 | exit 3.14159 | exit 只接受 0 - 255 范围内的整数参数 | | 128+n | 致命错误信号 | *kill -9* `\)PPID` of script |
130 | 由 Ctrl-C 终止的脚本 | Ctrl-C | Ctrl-C 是致命错误,错误信号是2 |
255* | 退出状态超出范围 | exit -1 | exit 只接受 0 - 255 范围内的整数 |
- 根据上表,退出代码 1 - 2、126 - 165 和 255 [1] 具有特殊含义,因此对于用户指定的退出参数应避免使用。 以退出 127 结束脚本肯定会在故障排除时引起混淆(错误代码是“找不到命令”还是用户定义的?)。 但是,许多脚本使用退出 1 作为一般的错误救助。 由于退出代码 1 表示许多可能的错误,因此它在调试中并不是特别有用。