0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Docker容器退出码是什么意思?导致该退出码的动作是什么

马哥Linux运维 来源:徐亚松(占洋) 作者:徐亚松(占洋) 2022-08-02 09:55 次阅读

为什么我的容器没有运行?

回答这个问题需要知道 Docker 容器为什么退出,退出码会提示容器停止运行的情况。本文列出了最常见的退出码,来回答两个重要问题:

这些退出码是什么意思?

导致该退出码的动作是什么?

exit code:代表一个进程的返回码,通过系统调用 exit_group 来触发。在 POSIX 中,0 代表正常的返回码,而 1-255 代表异常返回码,不过一般错误码都是 1。这里有一张附表 Appendix E. Exit Codes With Special Meanings

如何查看退出码

方法一:查看 pod 中的容器退出码

$kubectldescribepodxxx

74a515f8-11a5-11ed-ba43-dac502259ad0.jpg

方法二:用 Docker 查看

$ dockerps--filter"status=exited"
$ dockerinspect--format='{{.State.ExitCode}}'

方法三:手动输出

$ dockercontainerrunalpinesh-c"exit1"

$dockercontainerls-a

CONTAINERIDIMAGECOMMANDCREATEDSTATUS
61c688005b3aalpine"sh-c'exit1'"AboutaminuteagoExited(1)3secondsago

常见退出码

Exit Code 0

退出代码0表示特定容器没有附加前台进程。

该退出代码是所有其他后续退出代码的例外。

这不一定意味着发生了不好的事情。如果开发人员想要在容器完成其工作后自动停止其容器,则使用此退出代码。

如果你执行 docker run hello-world, 你会得到“Hello from docker!”,但查看容器的时候docker ps -a | grep hello-world,会发现状态码为 0

74b736d4-11a5-11ed-ba43-dac502259ad0.jpg

Exit Code 1

程序错误,或者 Dockerfile 中引用不存在的文件,如 entrypoint 中引用了错误的包

程序错误可以很简单,例如 “除以0”,也可以很复杂,比如空引用或者其他程序 crash

Exit Code 137

表明容器收到了 SIGKILL 信号,进程被杀掉,对应 kill -9

引发 SIGKILL 的是 Docker Kill。这可以由用户或由 Docker 守护程序来发起,手动执行:docker kill

137 比较常见,如果 pod 中的 limit 资源设置较小,会运行内存不足导致 OOMKilled,此时 state 中的 "OOMKilled" 值为 true,你可以在系统的 dmesg 中看到 oom 日志

Exit Code 139

表明容器收到了 SIGSEGV 信号,无效的内存引用,对应 kill -11

一般是代码有问题,或者 docker 的基础镜像有问题

Exit Code 143

表明容器收到了 SIGTERM 信号,终端关闭,对应 kill -15

一般对应 docker stop 命令

有时 docker stop 也会导致 Exit Code 137。发生在与代码无法处理 SIGTERM 的情况下,docker 进程等待十秒钟然后发出 SIGKILL 强制退出。

不常用的一些 Exit Code

Exit Code 126: 权限问题或命令不可执行

Exit Code 127: Shell 脚本中可能出现错字且字符无法识别的情况

Exit Code 1 或 255:因为很多程序员写异常退出时习惯用 exit(1) 或 exit(-1),-1 会根据转换规则转成 255。这个一般是自定义 code,要看具体逻辑。

退出状态码的区间

必须在 0-255 之间,0 表示正常退出

外界将程序中断退出,状态码在 129-255

程序自身异常退出,状态码一般在 1-128

假如写代码指定的退出状态码时不在 0-255 之间,例如: exit(-1),这时会自动做一个转换,最终呈现的状态码还是会在 0-255 之间。我们把状态码记为 code,当指定的退出时状态码为负数,那么转换公式如下:256 – (|code| % 256)



审核编辑:刘清


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Docker
    +关注

    关注

    0

    文章

    437

    浏览量

    11603
  • docker容器
    +关注

    关注

    0

    文章

    28

    浏览量

    3288
收藏 人收藏

    评论

    相关推荐

    模块 DPM工业扫

    模组
    深圳市远景达物联网技术有限公司
    发布于 :2024年04月23日 16:23:25

    STM32调试进入低功耗而没有退出如何解决?

    STM32调试遇到如图问题,大意是进入低功耗而没有退出,请教大神们如何解决?
    发表于 03-22 07:52

    docker容器有几种状态

    Docker 是一种流行的容器化平台,它能够帮助开发人员将应用程序和其依赖打包成一个独立的容器,并且能够在不同的环境中进行部署和运行。在 Docker 中,
    的头像 发表于 11-23 09:50 839次阅读

    docker进入容器的方法有哪些

    Docker是一种流行的容器化平台,它能够快速构建、交付和运行应用程序。在使用Docker时,我们经常需要进入容器进行调试、管理和运行命令等操作。本文将详细介绍
    的头像 发表于 11-23 09:45 3466次阅读

    docker容器容器之间通信

    Docker是一种轻量级容器化技术,能够将应用程序及其依赖项封装在一个独立、可移植的容器中。而容器化的应用程序通常是以分布式方式设计的,因此实现容器
    的头像 发表于 11-23 09:36 549次阅读

    docker容器删除后数据还在吗

    Docker作为一个容器化平台,提供了轻量级的虚拟化解决方案,能够方便地创建、部署和管理应用程序。然而,对于Docker容器的数据持久性是一个令人关注的问题。当我们删除一个
    的头像 发表于 11-23 09:32 683次阅读

    JDK如何优雅退出一个线程?

    需要线程退出的常见场景 任务执行完成,或异常终止,任务认为无需再占用线程。 线程池根据当前任务执行情况,伸缩线程池。当任务执行较少时,退出空闲的线程。 服务或进程在关闭阶段,例如滚动
    的头像 发表于 11-17 10:02 230次阅读
    JDK如何优雅<b class='flag-5'>退出</b>一个线程?

    1000MW机组高加退出对机组的影响

    高加退出是火电厂常见事故,特别是单列高加退出,对机组协调控制系统及主要参数的扰动比较大。若处理不当,可能导致超温、超压、扩大事故等严重后果。结合某1 000 MW机组单列高加退出过程,
    的头像 发表于 11-13 15:58 925次阅读
    1000MW机组高加<b class='flag-5'>退出</b>对机组的影响

    使用Docker容器编译OK3568源代码

    经常编译系统,又免不了搭建各种开发环境,所以为了不对开发主机的环境有影响,使用Docker容器编译代码是比较方便和省心的方式。 编译OK3568的源代码,需要用Ubunut 18.04版本,我的开发
    发表于 10-19 10:36

    如何使用 Docker容器化技术

    对于开发人员来说,Docker肯定都不陌生,今天小编带大家重新学习一下Docker。 什么是 Docker 官话: Docker 是一种开源的容器
    的头像 发表于 09-30 11:24 1w次阅读

    OOM会导致JVM虚拟机退出

    熟悉Java开发的人,应该会经常遇到的异常:OOM,那么这个异常会导致 JVM 虚拟机退出吗? 1、结论 Java虚拟机(JVM)在运行Java应用时,可能会遇到内存不足的情况,从而抛出
    的头像 发表于 09-30 10:14 321次阅读

    线路充电时为什么退出主一保护?

    线路充电时为什么退出主一保护? 在充电时,有时候会出现退出主一保护的情况,这是因为线路充电时遇到了某些问题,导致了电池出现了异常情况,为了保护电池和设备安全,充电器通过检测到异常信号自动退出
    的头像 发表于 09-27 16:10 426次阅读

    如何判断是否在docker镜像中?

    /issue 可以发现两者区别。 还有一个方法,就是修改主机名: 因为 docker 创建使用的是 host 模式,所以需要创建完 docker 容器后,退出,在云主机上修改: # 已
    发表于 09-20 07:42

    docker基础知识和使用bmnnsdk时的docker常用命令

    ./docker_run_bmnnsdk.sh 添加命名docker image:--name=yourname,运行脚本文件,之后可以重复使用容器,省去一些重复初始化
    发表于 09-18 07:59

    Docker容器和Kubernetes退出码中文指南

    容器终止时,容器引擎使用退出码来报告容器终止的原因。如果您是 Kubernetes 用户,容器故障是 pod 异常最常见的原因之一,了解
    发表于 06-06 10:08 174次阅读