Centos docker容器因6分段故障而崩溃 - 这是核心转储
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Centos docker容器因6分段故障而崩溃 - 这是核心转储相关的知识,希望对你有一定的参考价值。
运行Centos 7.1.1503 docker容器,当添加几行代码(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 %t e
容器中没有/ var / spool / abrt目录。运行容器的服务器上的/ var / spool / abrt目录没有得到任何结果。由于只读的fs,我无法将/ proc / sys / kernel / core_pattern更改为指向另一个目录/程序。无法在特权中运行容器:-(
我已经阅读了大量的docker / stackexchange和其他文档,无法弄清楚在哪里/如何获得核心转储?
在过去,我会玩设置并破坏机器的复制品,但这是一个生产容器,我在我能做什么以及何时/多少次崩溃时非常有限:-(
主机是RHEL 7.1,docker版本是1.7
编辑:在我的笔记本电脑上,运行相同的容器(虽然有docker 1.12),我有时通过在容器中运行sleep 60 &
,然后运行(仍在容器中)kill -ABRT <pid of the sleep 60>
,在主机/ var / spool / abrt上获得核心转储。通过“有时”我的意思是再次尝试并不总是有效......我不确定为什么,但是3次尝试中有2次成功。我认为这可能与特权运行或某事有关......?我用docker run -it centos bash
运行容器。如果我能理解这一点,我可能会在生产环境中复制这种行为。
执行以下命令以获取可能已启动的所有centos容器的文件系统上层路径的报告:
docker ps -a | grep centos | awk '{print $1}' | xargs docker inspect | grep UpperDir | cut -d" -f4
请记住,你必须成为sudo才能访问它们(在cd'ing之前运行sudo su
)
上面的命令执行以下操作:
- 获取主机中现有容器的报告
- 只选择其行中有centos的那些
- 获取该报告的第一行(容器ID)
- 检查每个容器
- 查找UpperDir参数(容器文件系统的上层,以及在进程崩溃时修改的那个)
- 剪切UpperDir字符串以改进演示
在那之后,你是独立的。恐怕我对崩溃本身没什么帮助。但如果你仍然怀疑,请写下我的一些内容,我会尽力帮助。
我希望这可以帮助你!
我最终跳过了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
测试一下:
sleep 60 &
kill -SEGV <pid of that sleep process>
应该能够在主机上的/ tmp目录中看到核心文件。当我的实例崩溃时,我终于在主机上获得了转储。
以上是关于Centos docker容器因6分段故障而崩溃 - 这是核心转储的主要内容,如果未能解决你的问题,请参考以下文章
简单的 C++ OpenCV imshow 示例因分段错误而崩溃
Docker 中的基本 Go RPC 因 SIGSEGV 而失败