Aristotle
发布于 2024-03-09 / 8 阅读 / 0 评论 / 0 点赞

Docker中缺少字体--如何解决呢?

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的基础镜像也未安装有fontconfigttf-dejavu字体。

解决

  1. openjdk:8-jdk-alpine更换成oraclejdk或者使用openjdk:8-jdk。但考虑到商业授权的问题,因此不更换,仍使用openjdk,但又因为alpine基础镜像已经是最小了,所以折中继续使用openjdk:8-jdk-alpine

  2. dockerfile构建文件中,安装fontconfig 和 ttf-dejavu字体

FROM openjdk:8-jdk-alpine

# 安装 fontconfig 和 ttf-dejavu字体
RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache --force

参考:https://199604.com/2383

最终方案是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