Docker运行验证码生成问题,Cannot evaluate java.awt.Font.toString()

项目场景:

使用密码+验证码登录系统,后端生成验证码与图片,并返回数据

问题描述

使用本地JDK(Oracle 1.8)与服务器JDK(Oracle 1.8)时,均可以生成验证码并返回,打包成镜像(openjdk:8-jdk-alpine)并运行时,生成验证码失败,并抛出异常
在这里插入图片描述

原因分析:

因为sun jdk1.8之后要开始收费了,不得已转入使用openJDK。相对于sun JDK来讲openJDK缺少了部分组件支持,并且重写了一些实现。在openJDK中,是不包含任何字体的,在生成图形验证码等使用awt.font的需求时,需要额外的字体支持。

解决方案:

  • 切换为使用包含字体的JDK:
     FROM bladex/alpine-java:8_server-jre_cn_unlimited
     MAINTAINER smallchill@163.com
     RUN mkdir -p /blade/test
     WORKDIR /blade/test
     EXPOSE 8008
     ADD ./target/blade-test.jar ./app.jar
    
     ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
    
     CMD ["--spring.profiles.active=test"]
    
     FROM bladex/alpine-java:openjdk8-openj9_cn_slim
    
     MAINTAINER smallchill@163.com
     
     RUN mkdir -p /blade/test
    
     WORKDIR /blade/test
    
     EXPOSE 8008
    
     ADD ./target/blade-test.jar ./app.jar
    
     ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
    
     CMD ["--spring.profiles.active=test"]
    
    • 阿里云加速JDK(同DockerHub中的alpine-java,只是上传到了阿里云镜像服务上):open-jdk
    	FROM  registry.cn-hangzhou.aliyuncs.com/ruozhuliufeng/open-jdk:8_server-jre_cn_unlimited
    	FROM  registry.cn-hangzhou.aliyuncs.com/ruozhuliufeng/open-jdk:openjdk8-openj9_cn_slim
    
  • Dockerfile文件添加字体:示例
FROM openjdk:8-jdk-alpine

EXPOSE 8888 
ENV LANG C.UTF-8
ADD target/ledger.jar app.jar

#解决字体问题
RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.13/main\n\
https://mirror.tuna.tsinghua.edu.cn/alpine/v3.13/community" > /etc/apk/repositories
RUN apk --update add curl bash ttf-dejavu && \
      rm -rf /var/cache/apk/*

CMD java -Xmx128m -Xmx128m -jar app.jar

ENTRYPOINT ["java","-Xmx128m","-Xmx128m","-jar","/app.jar"]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ruozhuliufeng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值