Alpine 3.6 OpenJDK 8 Bug

最近切换项目基础镜像踩到一个大坑,由于 alpine 基础镜像和 OpenJDK8 Bug 导致鼓捣了2天才解决,故记录一下这个问题

一、问题环境

出现问题的基本环境如下

  • OpneJDK 8u131
  • Alpine 3.6
  • Kaptcha (Java 验证码库)

二、问题描述

出现问题表象为 Spring Boot 项目启动后,访问注册页(有验证码)时,验证码不显示,后台报错信息大意为缺失字体库,安装字体后会报错说 libfontmanager.so: AWTFontDefaultChar: symbol not found

三、解决方案

当出现字体找不到这种错误时,原因是 Alpine 太过精简,导致里面没有字体,只需要安装字体即可,在 Dockerfile 中添加如下命令即可:

1
apk add --update font-adobe-100dpi ttf-dejavu fontconfig

当安装字体后,可能会出现如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Caused by: java.lang.UnsatisfiedLinkError: /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/libfontmanager.so: Error relocating /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/libfontmanager.so: AWTFontDefaultChar: symbol not found
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1845)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at sun.font.FontManagerNativeLibrary$1.run(FontManagerNativeLibrary.java:61)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerNativeLibrary.<clinit>(FontManagerNativeLibrary.java:32)
at sun.font.SunFontManager$1.run(SunFontManager.java:339)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<clinit>(SunFontManager.java:335)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:82)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.awt.Font.getFont2D(Font.java:491)
at java.awt.Font.getFamily(Font.java:1220)
at java.awt.Font.getFamily_NoClientCode(Font.java:1194)
at java.awt.Font.getFamily(Font.java:1186)
at java.awt.Font.toString(Font.java:1683)
at hudson.util.ChartUtil.<clinit>(ChartUtil.java:260)
at hudson.WebAppMain.contextInitialized(WebAppMain.java:194)
... 23 more

Google 半天,最后找到了 Alpine 官方 Bug 列表,在最后面做了回复,其中大意是: Alpine 3.6 版本的 Docker 镜像中安装的是 OpenJDK 8u131,这个版本有 BUG,并且在 3.6.3 的 OpenJDK 8.141.15 版本做了修复;从上面可知我们解决方案有两个:

  • 降级到 Alpine 3.5,其内的 OpneJDK 是 8u121 版本,没有这个 Bug
  • 升级到 Alpine Edge,其内部 OpenJDK 版本为 8.144.01,已经修复了这个 Bug

当然我选择浪一波,做了升级,最终基础镜像的 Dockerfile 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM alpine:edge

LABEL maintainer="mritd <mritd1234@gmail.com>"

ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
ENV JAVA_VERSION 8u144
ENV JAVA_ALPINE_VERSION 8.144.01-r0

RUN apk add --update bash curl tar wget ca-certificates unzip \
openjdk8=${JAVA_ALPINE_VERSION} font-adobe-100dpi ttf-dejavu fontconfig \
&& rm -rf /var/cache/apk/* \

CMD ["bash"]

Alpine 3.6 OpenJDK 8 Bug
https://mritd.com/2017/09/27/alpine-3.6-openjdk-8-bug/
作者
Kovacs
发布于
2017年9月27日
许可协议