Docker中缺少字体--如何解决呢?
来源:https://www.java265.com/docker/202208/4246.html
http://www.shadow-li.com.cn/alpine-jdk-font-null/
Docker openjdk-alpine 无法使用字体控件(fontconfig)的坑
#增加字体,解决验证码、图片处理没有字体报空指针问题
RUN apk --no-cache add ttf-dejavu fontconfig
而正常的开发环境暂时还是在宿主机用oralce jdk跑服务,未出现此问题。
问题分析及解决
问题分析
因为Java服务现在都是用openjdk:8-jdk-alpine
为基础镜像进行构建的,再通过看具体错误和经过一些google
,可以确定两个问题:
1.openjdk
不包括sum.awt
的字体控件
2.alpine linux
的基础镜像也未安装有fontconfig
和ttf-dejavu
字体。
解决
将
openjdk:8-jdk-alpine
更换成oraclejdk
或者使用openjdk:8-jdk
。但考虑到商业授权的问题,因此不更换,仍使用openjdk
,但又因为alpine
基础镜像已经是最小了,所以折中继续使用openjdk:8-jdk-alpine
在
dockerfile
构建文件中,安装fontconfig 和 ttf-dejavu
字体
FROM openjdk:8-jdk-alpine
# 安装 fontconfig 和 ttf-dejavu字体
RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache --force
最终方案是在
openjdk:8-jdk-alpine
基础镜像中再封装私有的镜像原因是Jenkins流水线上每次打包构建镜像都要 apk
fontconfig和ttf-dejavu
,构建过程非常慢!!!!
最终镜像Dockerfile
FROM openjdk:8-jdk-alpine
ENV TIME_ZONE="Asia/Shanghai"
RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache --force
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && \
echo $TIME_ZONE > /etc/timezone && \
addgroup -g 2888 xinsec && \
adduser -u 2888 -G xinsec -h /home/xinsec -D xinsec