如何在docker容器中生成核心文件?

如何在docker容器中生成核心文件?,docker,gcc,coredump,Docker,Gcc,Coredump,使用ulimit命令,我设置了核心文件的大小 ulimit-c unlimited 我使用gcc-g选项编译了c源代码。 然后,a.out生成。 命令后 /a.out 存在运行时错误 (core dumped) 但未生成核心文件。(例如core.294340) 如何生成核心文件?首先确保容器将核心写入容器文件系统中的现有位置。核心生成设置在主机中设置,而不是在容器中设置。例如: echo '/cores/core.%e.%p' | sudo tee /proc/sys/kernel/core_

使用ulimit命令,我设置了核心文件的大小

ulimit-c unlimited

我使用gcc-g选项编译了c源代码。 然后,a.out生成。 命令后

/a.out
存在运行时错误

(core dumped)
但未生成核心文件。(例如core.294340)


如何生成核心文件?

首先确保容器将核心写入容器文件系统中的现有位置。核心生成设置在主机中设置,而不是在容器中设置。例如:

echo '/cores/core.%e.%p' | sudo tee /proc/sys/kernel/core_pattern
将在文件夹/核心中生成核心

在Dockerfile中,创建该文件夹:

RUN mkdir /cores
您需要指定核心大小限制;ulimit shell命令不起作用,因为它只影响当前shell。您需要使用docker运行选项--ulimit,并具有软限制和硬限制。构建Docker映像后,使用以下内容运行容器:

docker run --ulimit core=-1 --mount source=coredumps_volume,target=/cores ab3ca583c907 ./a.out
其中coredumps_volume是您已经创建的卷,在容器终止后,core将保留在该卷中。例如

docker volume create coredumps_volume

如果要生成现有进程的核心转储,例如使用
gcore
,则需要使用
--cap add=SYS\u PTRACE
启动容器,以允许在容器内以root身份运行的调试器附加到进程。(对于信号上的堆芯转储,请参见另一个答案)

它可能与的重复有关吗?请将
--ulimit core=9999999999:9999999999
替换为
--ulimit core=-1
。如何更改每个容器的路径:第一个命令如何在docker容器中工作,
/proc
以只读方式装载?基本上,您应该会遇到。我只能在Dockerfile中使用
RUN mkdir/cores&&chmod 777/cores
(默认情况下,它有755权限,我根本没有得到转储文件)。考虑到我的进程是以root用户身份运行的,你知道为什么需要对group/other进行写权限吗?但是可以从主机调用
gcore
,以避免将这些权限授予容器本身,并且必须将
gcore
放在映像中吗?@dolmen Yep,在主机上查找进程可能很困难,取决于正在运行的容器数量