理解 Docker 容器退出码

部署运行你感兴趣的模型镜像

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

997c99cb1ded54b3894311ace1bdc2f0.png

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

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

  • 这些退出码是什么意思?

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

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

如何查看退出码

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

$ kubectl describe pod xxx

94df8e03810cffb5bff6cecf56ffe672.jpeg

方法二:用 Docker 查看

$ docker ps --filter "status=exited"
$ docker inspect <container-id> --format='{{.State.ExitCode}}'

方法三:手动输出

$ docker container run alpine sh -c "exit 1"

$ docker container ls -a

CONTAINER ID   IMAGE    COMMAND            CREATED              STATUS                       
61c688005b3a   alpine   "sh -c 'exit 1'"   About a minute ago   Exited (1) 3 seconds ago

常见退出码

Exit Code 0

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

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

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

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

bbe97a8fe4311f372f3f041e41cbe2bf.jpeg

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)

参考

  • http://tldp.org/LDP/abs/html/exitcodes.html

  • https://imroc.io/posts/kubernetes/analysis-exitcode/

  • https://medium.com/better-programming/understanding-docker-container-exit-codes-5ee79a1d58f6

本文转载自:「 Vermouth 的博客 」,原文:https://url.hi-linux.com/bfCGL ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

42845936097a035c370521f9d968932f.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

92a2242de33729389653bf538b1730e7.png

你可能还喜欢

点击下方图片即可阅读

a3b54021c20c4c016684ebcd9fbb8c38.png

Archery: 一款超强大的在线 SQL 审核平台,爆赞推荐

3a8bfaea6134c256320a381c92d4efbf.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

113e428302d0fc6b5cab0c067b6ee1b5.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

<think>嗯,用户问的是Docker退出容器的问题。我需要先回想一下Docker的基本操作,特别是关于容器的进入和退出部分。用户可能是在使用docker exec或者docker run启动容器后,想要退出但保持容器运行,或者直接停止容器。这时候需要区分两种情况:退出后容器继续运行还是停止。 首先,常用的退出方法有哪些呢?最常见的是在容器内使用exit命令或者Ctrl+D。这会导致容器停止,如果容器是以默认设置启动的。不过,如果用户希望退出后容器仍然运行,可能需要使用Ctrl+P然后Ctrl+Q这种组合键,也就是detach模式。这时候容器不会停止,用户之后还能用docker attach重新连接。 另外,用户可能混淆了docker run和docker exec的区别。docker run创建新容器,而docker exec是在已运行的容器中执行命令。比如,用docker run -it启动的容器,如果直接exit,容器会停止。而如果使用docker exec -it进入正在运行的容器,exit后容器可能还在运行,这取决于是否还有其他进程在运行。 还有,用户可能不知道--detach-keys这个参数,可以自定义detach的快捷键。比如改成Ctrl+a,这样可能更方便一些。不过这个需要配置,不是默认的。 需要注意,如果用户使用docker attach连接到容器,直接exit或者Ctrl+C可能会导致容器停止,而用detach快捷键则不会。这时候需要提醒用户区分这两种情况。 另外,用户可能遇到的问题是在退出容器后,容器停止了,导致服务中断。这时候需要指导用户如何保持容器后台运行,比如使用-d参数启动容器,或者在退出时使用detach快捷键。 总结一下,回答应该分点说明不同的退出方式及其影响,包括exit命令、Ctrl+D、detach快捷键,以及如何保持容器运行。同时,可能需要提醒用户使用docker ps -a查看容器状态,确认退出后的结果是否符合预期。</think>当使用Docker容器交互时,退出容器的方式会影响容器的运行状态。以下是详细说明: --- ### 一、两种典型退出场景 1. **`docker run`启动新容器时** ```bash docker run -it ubuntu /bin/bash ``` - 此时进入的是容器的主进程(`PID 1`) - 直接退出会**终止容器** 2. **`docker exec`进入已运行容器时** ```bash docker exec -it my_container /bin/bash ``` - 此时进入的是容器的新进程 - 退出**不会影响**容器主进程 --- ### 二、退出方式及其影响 #### 方法1:退出并停止容器 - **操作**:输入`exit` 或按 `Ctrl+D` - **效果**: - 终止当前shell进程 - 如果这是容器的**主进程**,容器将停止 - 适用于`docker run`启动的交互式容器 #### 方法2:退出但保持容器运行 - **操作**:按 `Ctrl+P` + `Ctrl+Q` - **效果**: - 从容器中分离(detach) - 容器保持后台运行 - 可通过`docker attach`重新连接 - **验证状态**: ```bash docker ps # 查看运行中的容器 ``` --- ### 三、高级配置技巧 1. **自定义分离快捷键** ```bash docker attach --detach-keys="ctrl-a" my_container ``` 2. **后台启动容器** ```bash docker run -itd ubuntu # -d参数使容器后台运行 ``` --- ### 四、常见问题排查 1. **退出后容器意外停止** - 检查是否主进程被终止 - 建议使用`tail -f /dev/null`保持进程 ```bash docker run -itd ubuntu tail -f /dev/null ``` 2. **无法分离容器** - 确保使用`-it`参数启动交互模式 - 检查终端是否支持控制序列 --- 通过合理选择退出方式,可以精准控制容器的生命周期。建议通过`docker ps -a`观察容器状态变化,实践中加深理解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值