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

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

  1. 获取主机中存在的所有容器的报告
  2. 只select在他们的行中有centos的那些
  3. 获取该报告的第一行(容器ID)
  4. 检查每一个这些容器
  5. 查找UpperDir参数(容器文件系统的上层,以及在进程崩溃时修改的参数)
  6. 剪下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目录中看到核心文件。 当我的实例崩溃时,我终于在主机中得到了转储。