如何禁用Docker容器中的核心文件转储


13

我的PHP容器运行puppeteer生成PDF。通过生成PDF文档,它还在我的容器内创建了两个核心转储文件。我不确定它们的真正来源。

主机/服务器是CentOS 7。

我检查了以下内容:

  1. 没有应用程序错误日志,Browsershot / Puppeteer正在运行,没有错误。
  2. 找不到错误日志(例如segfault) /var/log/messages

我试图禁用核心转储

通过遵循https://linux-audit.com/understand-and-configure-core-dumps-work-on-linux/的 Disable core dumps部分,我完成了:

  1. 将以下内容添加到 /etc/security/limits.conf
* soft core 0
* hard core 0
  1. 通过以下方式创建了disable-core-dumps.sh: echo “ulimit -c 0 > /dev/null 2>&1” > /etc/profile.d/disable-coredumps.sh

  2. 添加了以下内容 /etc/systemd/coredump.conf

[Coredump]

Storage=none
ProcessSizeMax=0
  1. 重新启动服务器和容器

  2. 我也尝试过ulimit -c 0在容器内设置(高山)

以上所有技巧都不适合我。人偶每次生成PDF时,总是会创建两个核心转储文件,如下所示:

core.131 core.52

核心文件如下所示:

核心转储文件内容

谁能帮我禁用核心转储?非常感谢。


我认为您需要禁用主机(而不是容器)上的核心转储,或者以已损坏的容器身份运行容器
LinPy

@LinPy我已经通过遵循linux-audit.com/…在主机上禁用了核心转储 。尝试禁用主机和容器上的核心转储。他们都不工作。
乔纳森

如果您想找到这些核心转储的根本原因而不是禁用它们,那么我建议您更多地研究p。由于puppeteer使用nodejs,并且coredump中包含nodejs模块/库,因此好像nodejs进程有问题。可以使用一些调试选项,例如禁用伪造者的无头模式将启用详细日志记录。这是更多信息的链接:github.com/puppeteer/puppeteer#debugging-tips
ahasbini

尝试编辑Docker文件中的/etc/security/limits.conf /etc/systemd/coredump.conf insitde容器,该容器描述了如何构建映像
Ryabchenko Alexander

@ahasbini奇怪的是,PDF是完美生成的。我启用了调试,但是找不到任何有用的东西。只是核心转储。
乔纳森

Answers:


3

您必须使用--ulimit core=0禁用核心转储的选项启动容器。

参考:https : //docs.docker.com/engine/reference/commandline/run/#set-ulimits-in-container---ulimit

在主机上,将coredump路径临时设置为/tmp进行验证:

echo '/tmp/core.%e.%p' | sudo tee /proc/sys/kernel/core_pattern

照常启动容器并强制进行核心转储:

docker run --rm -it bash
(inside the container)
# yes > /dev/null &
# kill -SIGABRT $(pidof yes)
# ls /tmp
(shows core.yes.<pid>)

现在,使用--ulimit core=0

docker run --ulimit core=0 --rm -it bash
(inside the container)
# yes > /dev/null &
# kill -SIGABRT $(pidof yes)
# ls /tmp
(No entries)

感谢您的回答。我正在使用compose,并通过将soft和hard设置为0尝试了ulimit配置。但是仍然无法正常工作。docker run — ulimit core = 0是否与将compose的ulimit设置为0相同?
乔纳森

我认为应该将其添加到entrypoint.sh启动php应用程序的同一命令中
ahasbini

2

我也在docker swarm服务上也遇到了这个问题,并且--ulimit core = 0在我在以下命令中使用的swarm服务中不起作用,并且在docker swarm服务中为我工作了!

sysctl -w kernel.core_pattern = / dev / null


谢谢!这也可以解决问题。
乔纳森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.