Ubuntu 16.04 Docker容器中JVM进程Core Dump获取失败求助
解决Ubuntu Docker容器中Core Dump无法生成的问题
我帮你梳理下问题所在和解决办法——Docker容器默认确实会限制core dump的生成,结合你给出的日志和Dockerfile,主要有几个关键点需要调整:
为什么core dump没生成?
你的崩溃日志里明确说"Core dump written"但找不到文件,主要是因为Ubuntu 16.04的Docker容器默认有两个限制:
- 内核层面把core dump转发给了
apport服务,而不是生成本地文件; - 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
相关产品推荐
相关产品推荐

