[TOC]

前言

我用docker开启容器靶场的时候,出现这个报错,最后出现139报错代号,然后去网上查找各种资料到处试,最后问题解决了,用这篇文章记录一下。

问题描述

library initialization failed - unable to allocate file descriptor table - out of memory#

翻译过来就是说:库初始化失败 - 无法分配文件描述符表 - 内存不足#

原因

(1) LimitNOFILE=infinity 虽然是不限制,但是在systemctl版本小于234的时候不生效,查看systemctl版本:systemctl --version

(2) docker容器的ulimit太小了,有文档说太大也不行

解决方法

解决方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
#修改/lib/systemd/system/docker.service文件

LimitCORE=infinity
LimitNOFILE=infinity
LimitNPROC=infinity
改成
LimitCORE=65535
LimitNOFILE=65535
LimitNPROC=65535

#重启docker服务
systemctl daemon-reload
systemctl restart docker

解决方法二

问题
因运存不足无法给进程分配更多的文件句柄数而异常退出

原运行指令

1
docker run  -d -p 8080:8080 docker-test:v1.0
1
docker run --ulimit nofile=1024 -d -p 8080:8080 docker-test:v1.0

改为

解决方法三

在 /etc/systemd/system/ 目录下, 创建 docker.service.d 目录
进入该目录,创建一个文件,名为 docker.conf
在文件中加入以下配置:

1
2
3
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --default-ulimit nofile=65535:65535 -H fd://

个人总结

我是使用的方法一修改了一下,修改/lib/systemd/system/docker.service文件,大概如下图:

在ExecStart后面加上

1
--default-ulimit nofile=65535:65535

image-20250326225855172

然后按方法一修改

image-20250326225917085

然后记得重启docker

1
2
systemctl daemon-reload
systemctl restart docker

之后问题就解决了。