起因
近日有个项目用到了LED,负责与LED通讯的SDK是java,实现了通过接口来调用LED。
本地Springboot项目怎么跑都没问题,打成jar发布到服务器上就报错,服务器采用docker部署。
以下是Dockerfile内容
FROM java:8-alpine VOLUME /tmp ADD app.jar app.jar ADD /images/ /images/ EXPOSE 8080 RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
错误信息
java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
定位问题
原因是Alpine环境缺少对应的包。此问题影响所有使用官方Alpine的Java环境。
解决办法
Dockerfile添加如下代码
RUN apk add --update ttf-dejavu fontconfig
或者
RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main\n\ https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/community" > /etc/apk/repositories RUN apk --update add curl bash ttf-dejavu && rm -rf /var/cache/apk/*
例如
FROM java:8-alpine
VOLUME /tmp
ADD app.jar app.jar
ADD /images/ /images/
EXPOSE 8080
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
# 解决alpine底包没有字体问题
RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main\n\
https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/community" > /etc/apk/repositories
RUN apk --update add curl bash ttf-dejavu && rm -rf /var/cache/apk/*
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]