初探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,此时stateOOMKilled设置为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 表示许多可能的错误,因此它在调试中并不是特别有用。