如何在 docker 容器中禁用核心文件转储

Posted

技术标签:

【中文标题】如何在 docker 容器中禁用核心文件转储【英文标题】:How to disable core file dumps in docker container 【发布时间】:2020-03-01 09:43:07 【问题描述】:

我的 php 容器运行 puppeteer 来生成 PDF。通过生成 PDF 文档,它还在我的容器内创建了两个核心转储文件。我不确定它们实际上来自哪里。

主机/服务器是 CentOS 7。

我检查了以下内容:

    没有应用程序错误日志,Browsershot/puppeteer 正在运行且没有错误。 在/var/log/messages 中找不到错误日志(例如段错误)

我已尝试禁用核心转储

按照https://linux-audit.com/understand-and-configure-core-dumps-work-on-linux/ 的禁用核心转储部分,我已经完成了:

    将以下内容添加到/etc/security/limits.conf
* soft core 0
* hard core 0

    创建了一个 disable-core-dumps.sh:echo “ulimit -c 0 > /dev/null 2>&1” > /etc/profile.d/disable-coredumps.sh

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

[Coredump]

Storage=none
ProcessSizeMax=0

    然后重启服务器和容器

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

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

core.131 core.52

核心文件如下所示:

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

【问题讨论】:

我认为您需要禁用主机而不是容器上的核心转储,或者将您的容器作为预先授权的容器运行 @LinPy 我已经按照linux-audit.com/… 禁用了主机上的核心转储。尝试在主机和容器上禁用核心转储。它们都不起作用。 如果您想找到这些核心转储的根本原因而不是禁用它们,那么我建议您更多地研究 puppeteer。由于 puppeteer 使用 nodejs 并且 coredump 中包含 nodejs 模块/库,因此看起来就像一个有故障的 nodejs 进程。有一些调试选项可以使用,例如禁用 puppeteer 的无头模式正在启用详细日志记录。以下是更多信息的链接:github.com/puppeteer/puppeteer#debugging-tips。 尝试编辑 /etc/security/limits.conf /etc/systemd/coredump.conf insitde 容器,例如在描述如何构建镜像的 Docker 文件中 @ahasbini 奇怪的是 PDF 是完美生成的。我启用了调试,但找不到任何有用的东西。只是核心转储。 【参考方案1】:

您必须使用选项--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应用程序的同一命令中【参考方案2】:

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

sysctl -w kernel.core_pattern=/dev/null

【讨论】:

【参考方案3】:

对于那些使用 docker-compose 的人,在 .yml 文件集中 ulimits:

services:
    app:
        ulimits:
            core:
                hard: 0
                soft: 0

【讨论】:

以上是关于如何在 docker 容器中禁用核心文件转储的主要内容,如果未能解决你的问题,请参考以下文章

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

对docker容器产生的日志做轮转

如何使用 kubernetes 从 mysqldump 恢复转储文件?

如何禁用默认的 asp net core config change watcher?

如何在命令行中使用Docker for Windows,并绕过/禁用GUI?

如何在 Docker 容器中从 WordPress(联系表格)发送电子邮件?