docker中的archlinux运行springboot项目出现异常

今天用docker中的archlinux容器运行springboot项目出现了如下异常
[root@488da3419a79 data]# java -jar springboot_01_quick_start-1.0-SNAPSHOT.jar library initialization failed - unable to allocate file descriptor table - out of memoryAborted (core dumped)
虽然英语不太好但是看见了out of memory*字样总感觉像是内存溢出。
问了一下chatgpt,其回答如下:
这个错误信息表示在尝试运行 java -jar 命令时发生了内存不足错误。错误信息中的 “unable to allocate file descriptor table” 表示 JVM 无法为新的文件描述符分配足够的内存。

这可能是因为您的系统没有足够的内存来分配文件描述符表,或者您的系统可能已经达到了文件描述符的最大限制。文件描述符是操作系统用于跟踪打开的文件和网络连接的标识符。

如果您遇到这个错误,可以尝试以下几个解决方法:

增加系统内存:如果您的系统没有足够的内存来分配文件描述符表,您可以尝试增加系统内存,以便 JVM 可以分配更多的内存。

增加文件描述符限制:如果您的系统已经达到了文件描述符的最大限制,可以尝试增加文件描述符的限制。您可以使用 ulimit 命令来检查和更改文件描述符限制。例如,要将限制增加到 65536,可以运行以下命令:

Copy
ulimit -n 65536


关闭不必要的文件句柄:如果您的系统有太多打开的文件句柄,则可以尝试关闭不必要的文件句柄。您可以使用 lsof 命令来检查当前打开的文件句柄。例如,要查看当前打开的文件句柄数,可以运行以下命令:

Copy
lsof | wc -l

如果您发现有太多的文件句柄,可以尝试关闭不必要的文件句柄来释放文件描述符。

机器人说文件描述符的最大限制太小了于是我查看了一下:
[root@e9a2770c7e99 ~]# ulimit -a real-time non-blocking time (microseconds, -R) unlimited core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 27328 max locked memory (kbytes, -l) 8192 max memory size (kbytes, -m) unlimited open files (-n) 1073741816 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
很显然 open files显然不小,可以说是很大。
遂以为是容器的内存太小导致的
通过docker stats <container_id>查看了一下
CONTAINER I
NAME
CPU %
MEM USAGE / LIMIT MEM %
NET I/O
BLOCK I/O ize (6 PIDS-C) n inited
488da3419a79
arch1
0.08%
224.8MiB / 6.71GiB3.27%
10.3MB
284kB
86.2MB15MB38 initedschedulin
内存是6.71G,看来是和宿主机是共享的,应该也不是内存太小的问题。
然后百度了一下看到一篇文章说参数并不是越大越好。于是就把openfiles的参数调小了
命令
ulimit -n 65536
然后再次启动,成功了。
看来真是open files的值默认设置的太大了,仔细数了一下10亿。。。。。。
至于为什么docker默认的openfiles的默认值为什么这么大以及这么大为什么报错,暂时也不得而知。


重启容器发现open files的值又恢复到了以前需要重新设置。
编辑/usr/lib/systemd/system/docker.service

sudo nano /usr/lib/systemd/system/docker.service

注意不同的系统可能服务配置文件路径不同
原ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock修改为:
ExecStart=/usr/bin/dockerd --default-ulimit nofile=65535:65535 -H fd:// --containerd=/run/containerd/containerd.sock

重新载入配置:
❯ systemctl daemon-reload

参考文章:http://www.dtmao.cc/Html5/88136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Docker运行Spring Boot项目,您需要完成以下步骤: 1. 创建Dockerfile:在项目根目录创建一个名为Dockerfile的文件,并添加以下内容: ``` FROM openjdk:8-jdk-alpine VOLUME /tmp ADD target/<your-project-name>.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] ``` 2. 构建Docker镜像:在终端进入项目根目录,并运行以下命令: ``` docker build -t <your-image-name> . ``` 3. 运行Docker容器:运行以下命令来启动Docker容器: ``` docker run -p 808:808 <your-image-name> ``` 现在,您的Spring Boot应用程序应该在Docker容器运行,并且可以通过http://localhost:808访问。 ### 回答2: Docker是一种流行的容器化平台,它能够将应用程序与其依赖的运行库和环境一起打包进一个镜像,使得应用程序可以在所有支持Docker的平台上运行,无需考虑底层系统的不同性。 Spring Boot是一个用于快速构建应用程序的开发框架,它具有自动配置、内嵌web容器等强大的特性,使得开发者能够快速开发、测试和部署应用程序。 将Spring Boot项目部署至Docker容器,需要按照以下步骤进行: 1. 编写dockerfile文件 在项目根目录创建一个名为dockerfile的文件,用于指定如何构建Docker镜像。下面是一个示例: ``` FROM openjdk:14-alpine VOLUME /tmp ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] ``` 在上述文件,我们首先指定基础镜像为openjdk:14-alpine,然后指定一个工作目录/tmp,接着利用ARG关键字指定应用的JAR文件名,然后将JAR文件复制到容器,最后指定容器启动时执行的命令。 2. 构建Docker镜像 使用以下命令在当前目录下构建Docker镜像: ``` docker build -t my-app-image . ``` 其,-t选项为镜像指定名称和标签,最后的"."表示dockerfile所在目录。 3. 运行Docker容器 运行以下命令以创建一个新容器并启动应用程序: ``` docker run -p 8080:8080 my-app-image ``` 上述命令将容器的8080端口映射到主机的8080端口,使得应用程序可以通过http://localhost:8080访问。 4. 查看Docker容器 使用以下命令查看当前正在运行的容器: ``` docker ps ``` 可以看到刚才启动的容器ID、镜像名称、命令、状态等信息。 通过以上步骤,就可以将Spring Boot项目部署至Docker容器运行,实现应用程序的可移植性和高可靠性。同时,Docker还提供了大量的管理和监控工具,使得容器的管理变得更加简单和便捷。 ### 回答3: Docker是现代开发不可或缺的一部分。通过Docker,您可以构建、部署和管理容器化的应用程序。Spring Boot是一个用于构建Java应用程序的框架,可以通过Docker运行Spring Boot项目。下面我们将详细讨论如何运行Spring Boot项目。 第一步:创建Spring Boot应用程序 首先,我们需要创建一个基于Spring Boot的应用程序。完成以后,将应用程序打包成可执行的JAR包。 第二步:编写Dockerfile 我们需要编写Dockerfile文件来构建Docker映像文件。Dockerfile是定义Docker映像文件构建过程的脚本。在Dockerfile,我们需要指定要使用的基础映像、将JAR包添加到映像、指定容器运行该应用程序时使用的端口号等。以下是一个简单的Dockerfile示例: ``` FROM openjdk:8-jdk-alpine MAINTAINER 作者 VOLUME /tmp ARG DEPENDENCY=target/dependency COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY ${DEPENDENCY}/META-INF /app/META-INF COPY ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.MyApplication"] ``` 第三步:构建Docker映像 我们需要使用docker build命令将Dockerfile转换为Docker映像: ``` $ docker build -t my_image . ``` 这个命令将为我们的应用程序创建一个名为“my_image”的Docker映像文件。 第四步:运行Docker映像 现在,我们只需要使用docker run命令来运行这个映像并启动应用程序。我们还需要使用-p参数指定要映射到主机的端口号。 ``` docker run -p 8080:8080 my_image ``` 现在,我们的Spring Boot应用程序已经在Docker容器运行了,我们可以通过浏览器访问它。只需在浏览器输入http://localhost:8080即可访问我们的应用程序。 总结 通过Docker容器化Spring Boot应用程序,我们可以更容易地部署、管理和升级应用程序。我们可以使用Docker构建和保存应用程序的镜像,以便在需要时轻松部署和运行应用程序。以上是如何运行Spring Boot项目的一个简单示例,但您可以根据自己的需要进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值