Docker运行SpringBoot项目报错

Docker运行SpringBoot项目报错

一、前因

  SpringBoot应用中有获取图片验证码的接口,使用Docker制作完镜像后,运行镜像,服务日志报如下错误:

java.lang.NullPointerException
    at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
    at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
    at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
    at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
    at sun.font.SunFontManager$2.run(SunFontManager.java:431)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.font.SunFontManager.<init>(SunFontManager.java:376)
    at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
    at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
    at java.awt.Font.getFont2D(Font.java:491)
    at java.awt.Font.access$000(Font.java:224)
    at java.awt.Font$FontAccessImpl.getFont2D(Font.java:228)
    at sun.font.FontUtilities.getFont2D(FontUtilities.java:180)
    at sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:670)
    at sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:831)
    at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:50)
    at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2926)
    at com.miaoshaproject.util.CodeUtil.generateCodeAndPic(CodeUtil.java:74)

制作镜像所使用的openjdk的基础版本为:openjdk:8-jdk-alpine,在GitHub上也有人提出过类似的issue:NullPointerException in Alpine JRE 8 Font.

很明显这是由于这个版本的openjdk底层缺少字体库依赖。

二、解决办法

2.1 更换基础镜像,如frolvlad/alpine-oraclejdk8:slim
2.2 在Dockerfile中加入字体库,如:

RUN apk add --no-cache ttf-dejavu

以上两种方式都可以解决此问题~

  • 1
    点赞
  • 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
发出的红包

打赏作者

Zerooooooooooooooooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值