文章转自https://komodor.com/learn/exit-codes-in-containers-and-kubernetes-the-complete-guide/,并做了一些补充
Docker退出码是指在容器内运行的命令或应用程序退出时返回给Docker守护进程的状态码。
下面是一些常见的Docker退出码:
状态码 | 名称 | 含义 |
---|---|---|
0 | 正常退出 | 表示命令或应用程序成功退出。 |
1 | 应用错误 | 容器因应用程序错误或镜像规范中的错误引用而停止 |
2 | 启动命令无效 | 表示无效的命令或参数错误 |
125 | 容器未能运行 | docker run 命令没有执行成功,docker本身有错误。 |
126 | 命令调用错误 | 表示不可执行的命令,可能由于文件权限或路径问题导致 |
127 | 找不到文件或目录 | 表示命令未找到,通常是由于路径问题或未安装所需的依赖项 |
128 | 退出参数无效 | 表示无效的退出参数或异常终止 |
130 | 用户终止 | 表示命令被用户终止,通常是通过Ctrl+C发送SIGINT信号 |
134 | 异常终止(SIGABRT) | 容器使用 abort() 函数自行中止 |
137 | 立即终止(SIGKILL) | 表示命令被强制终止,通常是因为超过了容器的内存限制 |
139 | 分段错误 (SIGSEGV) | 表示命令被强制终止,通常是因为超过了容器的内存限制 |
143 | 优雅终止(SIGTERM) | 表示命令被强制终止,通常是通过发送SIGTERM信号 |
255 | 退出状态超出范围 | 容器退出,返回可接受范围之外的退出代码,表示错误原因未知 |
退出代码 0 由开发人员在任务完成后故意停止容器时触发。从技术上讲,退出代码 0 意味着前台进程未附加到特定容器。
如果容器以退出码 0 终止怎么办?
退出代码 1 表示容器由于以下原因之一停止:
如果容器以退出码 1 终止怎么办?
Docker退出码2通常表示无效的命令或参数错误。当在Docker容器中执行的命令或应用程序使用了无效的命令或提供了无效的参数时,会导致退出码2的返回。
下面是一些可能导致退出码2的情况:
要解决退出码2的问题,您可以检查命令或应用程序的使用方式、提供的参数是否正确,并确保所需的依赖项已正确安装和配置。还可以查看相关的日志或错误信息以获取更具体的问题描述。
退出码 125 表示该命令用于运行容器。例如 docker run 在 shell 中被调用但没有成功执行。以下是可能发生这种情况的常见原因:
如果容器以退出码 125 终止怎么办?
退出码 126 表示无法调用容器镜像中使用的命令。这通常是用于运行容器的持续集成脚本中缺少依赖项或错误的原因。
如果容器以退出码 126 终止怎么办?
退出码 127 表示容器中指定的命令引用了不存在的文件或目录。
如果容器以退出码 127 终止怎么办?
与退出码 126 相同,识别失败的命令,并确保容器镜像中引用的文件名或文件路径真实有效。
退出码 128 表示容器内的代码触发了退出命令,但没有提供有效的退出码。Linux exit 命令只允许 0-255 之间的整数,因此如果进程以退出码 3.5 退出,则日志将报告退出代码 128。
如果容器以退出码 128 终止怎么办?
Docker退出码130通常表示命令被用户终止。当在Docker容器中执行命令时,如果用户通过Ctrl+C发送了SIGINT信号,命令将被终止,并返回退出码130给Docker守护进程。
SIGINT信号是一个中断信号,通常由用户在终端中按下Ctrl+C键触发。它用于通知正在运行的程序立即终止执行,这可能是因为用户希望提前退出命令或程序。
因此,当命令或程序在容器内部收到SIGINT信号并被终止时,Docker会将退出码130返回给守护进程。
如果您看到退出码130,意味着命令或程序被用户主动终止,而不是由于错误或异常导致的退出。
退出码 134 表示容器自身异常终止,关闭进程并刷新打开的流。此操作是不可逆的,类似 SIGKILL(请参阅下面的退出码 137)。进程可以通过执行以下操作之一来触发 SIGABRT:
如果容器以退出码 134 终止怎么办?
退出码 137 表示容器已收到来自主机操作系统的 SIGKILL 信号。该信号指示进程立即终止,没有宽限期。可能的原因是:
如果容器以退出码 137 终止怎么办?
退出码 139 表示容器收到了来自操作系统的 SIGSEGV 信号。这表示分段错误 —— 内存违规,由容器试图访问它无权访问的内存位置引起。SIGSEGV 错误有三个常见原因:
如果容器以退出码 139 终止怎么办?
退出码 143 表示容器收到来自操作系统的 SIGTERM 信号,该信号要求容器正常终止,并且容器成功正常终止(否则您将看到退出码 137)。该退出码可能的原因是:
如果容器以退出码 143 终止怎么办?
检查主机日志,查看操作系统发送 SIGTERM 信号的上下文。如果您使用的是 Kubernetes,请检查 kubelet 日志,查看 pod 是否以及何时关闭。
一般来说,退出码 143 不需要故障排除。这意味着容器在主机指示后正确关闭。
当您看到退出码 255 时,意味着容器的 entrypoint 以该状态停止。这意味着容器停止了,但不知道是什么原因。
如果容器以退出码 255 终止怎么办?