为什么我的容器没有运行?要回答这个问题,需要知道Docker容器为什么会退出,退出码会表示容器停止运行。这些退出代码是什么意思?导致此退出代码的操作是什么?exitcode:表示一个进程的返回码,由系统调用exit_group触发。在POSIX中,0代表正常返回码,1-255代表异常返回码,但是一般错误码都是1。这里有一个表格附录E.ExitCodesWithSpecialMeanings如何查看exitcode方法一:查看pod中容器的退出码$kubectldescribepodxxx方法二:使用Docker查看$dockerps--filter"status=exited"$dockerinspect--format='{{.State.ExitCode}}'方法三:手动输出$dockercontainerrunalpinesh-c"exit1"$dockercontainerls-aCONTAINERIDIMAGECOMMANDCREATEDSTATUS61c688005b3aalpine"sh-c'exit1'"大约一分钟前退出(1)3secondsagoCommonexitcodesExitCode0退出代码0表示没有前台进程附加到特定容器。此退出代码是所有其他后续退出代码的例外。这并不一定意味着发生了不好的事情。如果开发人员希望在完成工作后自动停止容器,则使用此退出代码。如果你执行dockerrunhello-world,你会得到“Hellofromdocker!”,但是查看容器时,dockerps-a|grephello-world,你会发现状态码是0ExitCode1程序错误,或者Dockerfile中引用的不是现有文件,比如entrypoint引用的包错误程序错误可以很简单,比如“除以0”,或复杂的,例如空引用或其他程序。crashExitCode137表示容器收到了SIGKILL信号,进程已经被kill掉,对应kill-9触发SIGKILL就是DockerKill。这可以由用户或Docker守护进程启动,并手动执行:dockerkill137更为常见。如果pod中的limitresource设置小了,会耗尽内存导致OOMKilled。此时state中“OOMKilled”的值为true。你可以在系统的dmesg中看到,oom日志ExitCode139表示容器收到了SIGSEGV信号,无效的内存引用,对应的kill-11一般是代码有问题,或者有docker基础镜像的问题。ExitCode143表示容器收到了SIGTERM信号,终端关闭,对应kill-15一般对应dockerstop命令,有时dockerstop也会导致ExitCode137。出现代码failingtohandleSIGTERM,docker进程等待十秒钟,然后发出SIGKILL强制退出。一些不常用的ExitCodesExitCode126:权限问题或命令无法执行ExitCode127:Shell脚本中可能有错别字和无法识别的字符ExitCode1或255:因为很多程序员习惯使用exit(1当写异常exit)或exit(-1)时,-1会根据转换规则转换为255。这个一般是自定义代码,看具体逻辑。退出状态码的范围必须在0-255之间。0表示正常退出,外界会打断程序。状态码在129-255之间,程序本身异常退出。状态码一般为1-128。如果code指定的退出状态码写的不是0-255之间,例如:exit(-1),此时会自动进行一次转换,最终的状态码还是0-255之间。我们将状态码记录为代码。当指定的退出状态码为负数时,转换公式如下:256-(|code|%256)