Docker环境openjdk-alpine的字体空指针处理

Docker环境openjdk-alpine的字体空指针处理

Docker环境openjdk-alpine的字体空指针处理

alpine是面向安全应用的轻量级linux发行版,alpine的基础镜像非常苗条,只有2-3mb,非常适合做为基础镜像,但是小巧的同时也意味着库和组件非常少

openjdk的镜像基于alpine制作,使用awt.sun的相关字体包会出现无法找到默认字体出现的空指针异常

java.lang.NullPointerException: null
    at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)

所以只需要在Dockerfile加入ttf-dejavufontconfig就能解决这个问题。我这里的Dockerfile示例如下:

# 基础官方镜像
FROM openjdk:8u201-jre-alpine3.9
# 维护人
MAINTAINER shadow.li0327@gmail.com
# 环境变量
ENV PROFILE=${PROFILE} \
    JAVA_OPTS=${JAVA_OPTS} \
    TZ=Asia/Shanghai

#增加字体,解决验证码、图片处理没有字体报空指针问题
RUN apk --no-cache add ttf-dejavu fontconfig

# 添加jar包
ADD target/xxx*.jar /opt/data/app.jar

# 日志数据卷
VOLUME /opt/data/logs
# 暴露端口
EXPOSE 8080
# 启动命令
CMD java -server -jar ${JAVA_OPTS} \
    /opt/data/app.jar \
    --spring.profiles.active=${PROFILE}

另本地打包脚本如下,本地&Jenkins均可使用

#!/usr/bin/env bash

## 应用名称&应用版本,读取pom.xml
app_name=$(xmllint --xpath '/*[local-name()="project"]/*[local-name()="artifactId"]/text()' pom.xml)
version=$(xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml)

# 拼接
app_name=${app_name}:${version}
# 私服推送
# registry=10.86.1.85:18089
# 打包
mvn clean
mvn package
# 停止本地容器,删除本地镜像
docker rm $(docker ps -a -f name=${app_name} -q)
docker rmi $(docker image ls -f reference=${app_name} -q) -f
# 构建镜像
docker build -t "${app_name}" .
# 构建本地上传包
docker save -o "${app_name}.tar" ${app_name}
# 标签
docker tag ${app_name} ${registry}/${app_name}
# 推送
docker push ${registry}/${app_name}
# 启动镜像
# docker run -p 8080:8080 --name=${app_name}
# 删除本地镜像,节省磁盘空间
docker rmi $(docker image ls -f reference=${app_name} -q) -f