项目场景:
使用密码+验证码登录系统,后端生成验证码与图片,并返回数据
问题描述
使用本地JDK(Oracle 1.8)与服务器JDK(Oracle 1.8)时,均可以生成验证码并返回,打包成镜像(openjdk:8-jdk-alpine)并运行时,生成验证码失败,并抛出异常
原因分析:
因为sun jdk1.8之后要开始收费了,不得已转入使用openJDK。相对于sun JDK来讲openJDK缺少了部分组件支持,并且重写了一些实现。在openJDK中,是不包含任何字体的,在生成图形验证码等使用awt.font的需求时,需要额外的字体支持。
解决方案:
- 切换为使用包含字体的JDK:
- Docker Hub 中,Bladex的JDK :alpine-java
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"]