“管道”核心模式不会在 docker 容器内创建核心转储

era*_*mos 5 coredump busybox docker

考虑这个简单的“管道”核心模式:

vagrant@myhost:~$ cat /proc/sys/kernel/core_pattern                        
|/var/core-manager.sh %t
Run Code Online (Sandbox Code Playgroud)

拥有这个同样简化的核心管理器脚本:

vagrant@myhost:~$ cat /var/core-manager.sh 
#!/bin/bash
(
  file=/tmp/mycore.$1
  cat > $file < /dev/stdin
)
Run Code Online (Sandbox Code Playgroud)

现在在 Linux 主机中重现并检索核心转储:

vagrant@myhost:~$ ls -lrt /tmp/mycore*
total 0
vagrant@myhost:~$ ulimit -c unlimited
vagrant@myhost:~$ sleep 100 &
[1] 16647
vagrant@myhost:~$ kill -SIGSEGV 16647
[1]+  Segmentation fault      (core dumped) sleep 100
vagrant@myhost:~$ ls -lrt /tmp/mycore*
-rw-rw-rw- 1 root root 385024 Jan 28 18:42 /tmp/mycore.1580233332
Run Code Online (Sandbox Code Playgroud)

现在,在容器(比方说 busybox)内重现它:

(正如你们许多人可能知道的那样,核心模式是由容器继承的,尽管 ulimit 不是,因为它取决于调用 shell,但可能“无限制”是 busybox shell 中的默认值,因为问题是我有无限的 ulimit对于容器内的核心大小“什么都不做”,这就是我真正想要的)。

vagrant@myhost:~$ docker run -it --rm busybox
/ # cat << EOF > /var/core-manager.sh
> #!/bin/bash
> (
>   file=/tmp/mycore.$1
>   cat > $file < /dev/stdin
> )
> EOF
/ # chmod a+x /var/core-manager.sh
/ # cat /proc/sys/kernel/core_pattern
|/var/core-manager.sh %t
/ # ulimit -c
unlimited
/ # sleep 100 &
/ # kill -SIGSEGV %1
/ # 
[1]+  Segmentation fault (core dumped) sleep 100
/ # ls -lrt /tmp/mycore*
ls: /tmp/mycore*: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我向核心管理器脚本添加了 a+x 权限,以防万一,但我认为没有必要(我不知道核心转储等异步系统任务的行为方式)。无论如何,如您所见,未创建核心转储

核心模式的常规路径位置在容器内(当然在主机上)完美工作,那么这让我认为 docker 中的某些内容限制了这种“管道”核心模式的使用。或者也许这是我现在看不到的东西。

任何想法 ?十分感谢!