Centos docker 容器因 6 分段错误而崩溃 - 核心转储在哪里

Centos docker container crashes with 6 Segmentation fault - where's the core dump

运行使用 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 更改为指向另一个 directory/program。也不能 运行 特权容器:-(

我已经阅读了大量 docker/stackexchange 和其他文档,但无法弄清楚 where/how 来获取核心转储?

在过去,我会玩弄设置并破坏机器的复制品,但这是一个生产容器,我能做的事情非常有限,when/how 很多次我可以让它崩溃:-(

主机是 RHEL 7.1,docker 版本是 1.7

编辑:在我的笔记本电脑上,运行使用同一个容器(尽管 docker 1.12),我有时会在主机上 /var/spool/abrt 通过 运行ning sleep 60 & 在容器中,然后 运行ning (仍在容器中) kill -ABRT <pid of the sleep 60> 。 "sometimes" 我的意思是再试一次并不总是有效......我不确定为什么,但大约三分之二的尝试成功了。我认为这可能与特权 运行 或其他东西有关..?我运行容器docker run -it centos bash。如果我能理解这一点,我可能会在生产环境中复制这种行为。

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

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

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

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

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

在那之后,你就靠自己了。恐怕我对崩溃本身无能为力。但是,如果您仍然有疑问,请给我写几行,我会尽力提供帮助。

希望对您有所帮助!

我最终跳过了 abrt 并将 core_pattern 文件更改为主机上的目录。这是我关于从崩溃的 docker 实例中获取核心转储的两个字节:

在主机上:

docker run --privileged -it -v /tmp:/core image-name bash

(您可以使用 docker exec 执行此操作,但我的机器没有可用于 exec 的标志)

--特权 = 需要能够编辑 /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 目录中看到核心文件。当我的实例崩溃时,我终于在主机中得到了转储。