docker容器内core dumped却找不到core文件

1. 检查ulimit, 使用命令:

ulimit -a

root@b7c19f6da1e3:/usr# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63525
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1048576
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

core file size: unlimited, 没问题

2. 检查core文件生成位置+命名方式的系统设置,使用命令:

cat /proc/sys/kernel/core_pattern

root@b7c19f6da1e3:/usr# cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c %d %P %E

core dump被通过管道(|开头表示管道)给apport程序处理了(被截胡了),因此没生成core文件

3. 修改/proc/sys/kernel/core_pattern,使用命令:

echo "core" > /proc/sys/kernel/core_pattern

root@867cf149306a:/usr# echo "core" > /proc/sys/kernel/core_pattern
/proc/sys/kernel/core_pattern: Read-only file system

结果报错只读文件不能修改,看来是权限不够

4. 修改docker容器内root权限

在docker容器内,看似已经使用了root用户,有最大权限,实际还是一个被限制的普通用户。

想要开启高级权限,需要在创建、进入docker容器时,加上--privileged参数,其中:

        a. 如果是用docker run创建启动容器,命令类似于

docker run -it --privileged=true –name containername 

        b. 如果是用docker-compose创建容器,需要在docker-compose.yaml配置文件中加上privileged: true

 1 version: '3.8'
  2 services:
  3   myservice:
  4     container_name: s1
  5     image: service_image:latest
  6     privileged: true
 11     volumes:
 12       - /etc/localtime:/etc/localtime:ro

然后在用docker exec进入时也带上--privileged参数,命令类似于

docker  exec --privileged -w / -it s1 /bin/bash

5. 修改/proc/sys/kernel/core_pattern文件

root@b7c19f6da1e3:/usr# echo "core" > /proc/sys/kernel/core_pattern
root@b7c19f6da1e3:/usr# cat /proc/sys/kernel/core_pattern
core

至此,问题解决,需要注意的是

a. /proc/sys/kernel/core_pattern文件内容如果没带路径(一般都不带相对、绝对路径),core文件会生成在导致core文件的程序相同路径下

b. 可以用%t(时间), %p(pid)来命名core文件

root@b7c19f6da1e3:/btc/coretest# echo "core_%t_%p" > /proc/sys/kernel/core_pattern
root@b7c19f6da1e3:/btc/coretest# cat /proc/sys/kernel/core_pattern
core_%t_%p
root@b7c19f6da1e3:/btc/coretest# ll
total 128
drwxr-xr-x 2 root root   4096 Nov 15 16:45 ./
drwxr-xr-x 1 root root   4096 Nov 15 16:44 ../
-rw------- 1 root root 249856 Nov 15 16:45 core-1700037947-206
-rwxr-xr-x 1 root root   9480 Nov 15 16:45 test*
-rw-r--r-- 1 root root     65 Nov 15 16:45 test.c
root@b7c19f6da1e3:/btc/coretest# ./test 
Segmentation fault (core dumped)
root@b7c19f6da1e3:/btc/coretest# ll
total 236
drwxr-xr-x 2 root root   4096 Nov 15 17:17 ./
drwxr-xr-x 1 root root   4096 Nov 15 16:44 ../
-rw------- 1 root root 249856 Nov 15 16:45 core-1700037947-206
-rw------- 1 root root 249856 Nov 15 17:17 core_1700039869_324
-rwxr-xr-x 1 root root   9480 Nov 15 16:45 test*
-rw-r--r-- 1 root root     65 Nov 15 16:45 test.c

你可能感兴趣的:(其它,docker,linux,core,core,dump)