Centos docker容器因6分段故障而崩溃 - 这是核心转储

问题描述 投票:0回答:2

运行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运行容器。如果我能理解这一点,我可能会在生产环境中复制这种行为。

docker centos segmentation-fault centos7 coredump
2个回答
1
投票

执行以下命令以获取可能已启动的所有centos容器的文件系统上层路径的报告:

docker ps -a | grep centos | awk '{print $1}' | xargs docker inspect | grep UpperDir | cut -d\" -f4

请记住,你必须成为sudo才能访问它们(在cd'ing之前运行sudo su

上面的命令执行以下操作:

  1. 获取主机中现有容器的报告
  2. 只选择其行中有centos的那些
  3. 获取该报告的第一行(容器ID)
  4. 检查每个容器
  5. 查找UpperDir参数(容器文件系统的上层,以及在进程崩溃时修改的那个)
  6. 剪切UpperDir字符串以改进演示

在那之后,你是独立的。恐怕我对崩溃本身没什么帮助。但如果你仍然怀疑,请写下我的一些内容,我会尽力帮助。

我希望这可以帮助你!


0
投票

我最终跳过了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目录中看到核心文件。当我的实例崩溃时,我终于在主机上获得了转储。

© www.soinside.com 2019 - 2024. All rights reserved.