可通过docker run --sysctl指定core_pattern、挂载安全卷并设ulimit -c=-1,配合chmod 1777宿主机dump目录及ENTRYPOINT校验,实现容器崩溃时core文件自动写入指定路径。

可以通过在 Dockerfile 中配置内核参数、设置容器启动时的 ulimit 限制,并挂载宿主机的安全卷来实现核心转储(core dump)文件自动写入指定路径。关键在于让容器内进程触发崩溃时,系统能将 core 文件生成到挂载的卷中,而非默认的不可写或临时路径。
启用并配置内核 core_pattern
Docker 容器默认继承宿主机的 /proc/sys/kernel/core_pattern,但通常为 core 或空值,且容器内无权限直接修改该值。稳妥做法是在容器启动前通过 --sysctl 或在 Dockerfile 的构建阶段做好准备:
- 使用
RUN echo '/tmp/core.%e.%p' > /proc/sys/kernel/core_pattern不生效(需特权+运行时) - 推荐方式:在
docker run时添加--sysctl kernel.core_pattern=/dump/core.%e.%p - 确保目标路径
/dump已通过-v /host/safe/dump:/dump挂载,且目录存在、权限开放(如chmod 1777 /host/safe/dump)
设置合理的 ulimit 和容器权限
核心转储受 ulimit -c(core file size)限制,默认常为 0(禁用)。必须显式放开:
- 在 Dockerfile 中无法直接设 ulimit,需在运行时指定:
docker run --ulimit core=-1: -v /host/dump:/dump ... - 若使用 docker-compose.yml,可写为:
ulimits:<br> core: -1
- 避免使用
--privileged,仅需--cap-add=SYS_ADMIN(部分内核版本需要)来支持 sysctl 修改
确保应用进程可写入 dump 目录
即使路径挂载成功,若进程以非 root 用户运行,可能因权限不足无法写 core 文件:
- 在 Dockerfile 中创建专用用户前,先
RUN mkdir -p /dump && chmod 1777 /dump - 若使用非 root 用户(如
USER appuser),确保该用户对/dump有写权限 —— 最稳妥是挂载后在宿主机设chmod 1777(sticky bit + world-writable) - 验证方式:进入容器执行
ulimit -c应返回unlimited或较大数值;cat /proc/sys/kernel/core_pattern应指向/dump/...
可选:在入口脚本中动态校验与修复
为增强健壮性,可在 ENTRYPOINT 脚本中加入检查逻辑:
- 检查
/dump是否可写:touch /dump/.test && rm /dump/.test || exit 1 - 确认 core_pattern 已就位:
echo "/dump/core.%e.%p" > /proc/sys/kernel/core_pattern 2>/dev/null || true(需 CAP_SYS_ADMIN) - 强制设置 ulimit:
ulimit -c unlimited(对当前 shell 及子进程生效)


















