在哪里可以找到Docker默认ulimit设置?运行roribio16/alpine-sqs镜像报错
错误触发原理
你遇到的启动错误是JVM类应用的常见问题:
- roribio16/alpine-sqs 内部运行的ElasticMQ是基于JVM开发的服务,JVM进程初始化时,会根据系统当前允许的最大打开文件数(nofile软限制)预分配对应的文件描述符表内存空间
- 如果容器内nofile配置过高(常见默认值为1048576),JVM申请对应大小的连续内存失败,就会抛出
library initialization failed - unable to allocate file descriptor table - out of memory错误,最终被SIGABRT信号终止 - 你手动指定
--ulimit nofile=122880:122880降低限制后,JVM预分配的内存大小降到可接受范围,服务就能正常启动
Docker容器默认ulimit的配置位置
Docker官方文档说的「继承宿主机配置」指的是继承Docker daemon进程的ulimit配置,而非宿主机普通登录用户的ulimit,优先级从高到低为:
- Docker daemon全局配置:
/etc/docker/daemon.json中的default-ulimits字段,示例配置如下:
{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 1048576, "Soft": 1048576 } } }
如果该字段存在,所有未手动指定--ulimit的容器都会直接使用该配置。
2. systemd服务配置:如果daemon.json未配置default-ulimits,且Docker通过systemd管理,则继承docker.service单元中设置的LimitNOFILE值。你可以执行命令systemctl show docker --property=LimitNOFILE查看当前Docker daemon的nofile限制,Arch/Manjaro系发行版的官方Docker包默认会将该值设为1048576,远高于普通用户的默认ulimit。
3. 最终兜底:如果以上两处都没有自定义配置,才会继承宿主机root用户的全局ulimit配置,对应/etc/security/limits.conf中的root用户配置。
不同桌面环境设备表现不一致的原因
- XFCE和KDE对systemd全局默认资源限制的默认配置不同:KDE桌面环境默认会调高systemd的
DefaultLimitNOFILE参数,对应配置文件为/etc/systemd/system.conf或/etc/systemd/user.conf,最终传导到Docker daemon的ulimit配置 - 也可能是两台设备安装Docker时的依赖包差异、手动修改过systemd的Docker服务override配置(存放在
/etc/systemd/system/docker.service.d/目录下)导致
你可以通过以下命令快速定位配置来源:
- 查看容器默认nofile:
docker run --rm busybox ulimit -n - 查看Docker daemon的nofile限制:
systemctl show docker --property=LimitNOFILE - 检查是否有daemon.json自定义配置:
cat /etc/docker/daemon.json - 检查Docker服务的systemd配置:
systemctl cat docker | grep LimitNOFILE
内容的提问来源于stack exchange,提问作者Hulatime
相关产品推荐
相关产品推荐

