You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16.04 Docker容器中JVM进程Core Dump获取失败求助

解决Ubuntu Docker容器中Core Dump无法生成的问题

我帮你梳理下问题所在和解决办法——Docker容器默认确实会限制core dump的生成,结合你给出的日志和Dockerfile,主要有几个关键点需要调整:

为什么core dump没生成?

你的崩溃日志里明确说"Core dump written"但找不到文件,主要是因为Ubuntu 16.04的Docker容器默认有两个限制:

  1. 内核层面把core dump转发给了apport服务,而不是生成本地文件;
  2. Docker默认设置了core文件大小为0,直接禁止生成core dump。

具体解决步骤

1. 解除容器的core文件大小限制

Docker默认会把ulimit -c(core文件大小限制)设为0,你需要在启动容器时显式解除这个限制:

  • 用docker run启动时添加参数:
    docker run --ulimit core=-1 -it your-image-name
    
    这里-1表示不限制core文件大小,和unlimited效果一样。
  • 如果用Docker Compose,在配置文件里添加ulimit设置:
    services:
      your-service:
        ulimits:
          core:
            soft: -1
            hard: -1
    

2. 修改内核的core dump输出格式

Ubuntu 16.04默认的core_pattern配置会把core dump发送给apport处理,不会生成本地文件。你需要修改这个配置:
进入容器后执行:

echo "core.%p" > /proc/sys/kernel/core_pattern

这个命令会让系统在当前工作目录生成名为core.进程ID的core dump文件。如果你想指定一个权限更宽松的目录(比如/tmp,避免权限问题),可以改成:

echo "/tmp/core.%p" > /proc/sys/kernel/core_pattern

要让这个配置在容器启动时自动生效,可以在启动容器时直接执行:

docker run --ulimit core=-1 -it your-image-name /bin/bash -c 'echo "core.%p" > /proc/sys/kernel/core_pattern && /bin/bash'

或者你也可以在Dockerfile里添加一个简单的entrypoint脚本,自动执行这个配置。

3. 确保目标目录有写入权限

你在/usr/local/bin目录运行应用,如果应用是以非root用户身份执行的,可能没有该目录的写入权限。可以:

  • 直接以root用户运行应用(容器默认就是root身份,除非你在Dockerfile里指定了USER指令);
  • 或者像上面说的,把core dump路径指定到/tmp这类全局可写的目录。

4. 验证配置是否生效

进入容器后,先确认大小限制已解除:

ulimit -c

如果输出是unlimited,说明第一步配置成功。再检查core_pattern:

cat /proc/sys/kernel/core_pattern

确认输出是你设置的格式(比如core.%p)。

完成这些配置后,重新运行你的应用,崩溃后就能在指定路径找到core dump文件了。

内容的提问来源于stack exchange,提问作者Nidhin MS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:07:36