Centos docker容器崩溃了6个分段错误 – 核心转储在哪里
运行一个Centos 7.1.1503docker容器,当添加几行代码(node.js)时,它会崩溃并显示错误:
/bin/sh: line 1: 6 Segmentation fault (core dumped) node --inspect server.js
文件/proc/sys/kernel/core_pattern
包含以下内容:
|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %te
容器中没有/ var / spool / abrt目录。 运行容器的服务器上的/ var / spool / abrt目录没有任何东西。 我不能改变/ proc / sys / kernel / core_pattern指向另一个目录/程序,因为只读fs的东西。 无法在特权中运行容器:-(
我已经读了吨的docker/堆栈交换和其他文档,不知道在哪里/如何得到核心转储?
在过去的一段时间里,我会玩这些设置并破坏机器的复制品,但是这是一个生产容器,我的能力非常有限,我可以做什么以及什么时候/多less次可以使它崩溃:-(
主机是RHEL 7.1,docker版本是1.7
编辑:在我的笔记本电脑上,运行相同的容器(与docker1.12虽然),我有时通过运行sleep 60 &
在容器中,然后运行(仍然在容器中) kill -ABRT <pid of the sleep 60>
主机 / var / spool / abrt核心转储kill -ABRT <pid of the sleep 60>
。 通过“有时候”我的意思是再次尝试并不总是工作…我不知道为什么,但约三分之二的尝试成功。 我认为这可能与特权运行或什么.. ..? 我用docker run -it centos bash
运行容器。 如果我能理解这一点,我可能在生产环境中复制这种行为。
执行以下命令,获取可能启动的所有centos容器的文件系统上层的path报告:
docker ps -a | grep centos | awk '{print $1}' | xargs docker inspect | grep UpperDir | cut -d\" -f4
请记住,你将不得不成为sudo才能访问它们(在cd'ing之前运行sudo su
)
上面的命令执行以下操作:
- 获取主机中存在的所有容器的报告
- 只select在他们的行中有centos的那些
- 获取该报告的第一行(容器ID)
- 检查每一个这些容器
- 查找UpperDir参数(容器文件系统的上层,以及在进程崩溃时修改的参数)
- 剪下UpperDirstring以改进显示
之后,你是自己的。 恐怕我对这次事故本身毫无帮助。 但如果你仍然怀疑,给我写几行,我会尽我所能。
我希望这可以帮助你!
我结束了跳过abrt并将core_pattern文件更改为主机上的目录。 这里是我的两个字节从一个崩溃的docker实例中获取核心转储:
在主机上:
docker run --privileged -it -v /tmp:/core image-name bash
(你可以用docker exec来做到这一点,但是我的机器没有exec标志)
–privileged =需要能够编辑/ proc / sys / kernel / core_pattern文件
-v =将主机的/ tmp目录挂载到容器中的/ core目录中
在这个例子中:
将核心转储的位置设置为/ core(这是主机中/ tmp目录的装载):
echo "/core/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern
testing它:
sleep 60 & kill -SEGV <pid of that sleep process>
应该能够在主机上的/ tmp目录中看到核心文件。 当我的实例崩溃时,我终于在主机中得到了转储。