如何在 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分段故障而崩溃 - 这是核心转储
如何使用 kubernetes 从 mysqldump 恢复转储文件?
如何禁用默认的 asp net core config change watcher?