Jenkins docker 容器退出时退出代码为 137 并且 oom Kill 为 false

2 docker

我们正在为 jenkins master 运行一个 docker 容器,它每 3 天就会以“exitcode 137”退出。我们必须重新启动 EC2 并启动映像才能使其再次运行。仅仅重新启动容器是行不通的。

退出容器上的 docker 检查为我们提供了以下信息: "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead":假,“Pid”:0,“退出代码”:137,“错误”:“”,“开始时间”:“2019-09-05T11:00:29.683406065Z”,“完成时间”:“2019-09-05T13:24 :26.336749715Z”

EC2 是一个 m5a.large 实例,具有 8GB 内存,正在运行的容器上的 docker stats 给了我这样的信息: CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 88530703bf01 xenodochial_chandrasekhar 0.58% 1.092GiB / 7.546 GiB 14.47% 3.12MB / 6.67MB 368MB / 11.3MB 0

内存使用量显示为 1.092GiB / 7.546GiB,这意味着内存上限是主机内存 8GB,并且 oomkilled 为 false。

docker log 命令不显示太多信息。

还有其他人遇到过这个问题吗?我们如何知道容器退出的原因呢?

小智 5

退出代码 137 表示该进程被信号 9 ( SIGKILL) 终止:

Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from os import *
>>> x = 137
>>> WIFEXITED(x)
False
>>> WIFSIGNALED(x)
True
>>> WTERMSIG(x)
9
>>> 
Run Code Online (Sandbox Code Playgroud)

这意味着某些其他进程(或者可能是内核本身)SIGKILL向容器中运行的主进程发送了信号。这就是它退出的原因。

如果是内核,内核日志中将会有一条消息(dmesg/var/log/kern.log)。查找“已终止进程”消息。

这也可能是由docker kill命令引起的。

docker stop如果(或restart等) 运行,但进程在 10 秒内没有退出,也会发生这种情况。因此,如果某些事情正在停止或重新启动容器,但您的 Jenkins 进程需要很长时间才能退出(例如,如果它等待作业完成),则可能会导致此行为。

希望这可以帮助。