9

Alpine 3.6 OpenJDK 8 Bug

 2 years ago
source link: https://mritd.com/2017/09/27/alpine-3.6-openjdk-8-bug/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

一、问题环境

出现问题的基本环境如下

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

二、问题描述

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

三、解决方案

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

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

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

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 如下

FROM alpine:edge

LABEL maintainer="mritd <[email protected]>"

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"]

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK