Alpine 3.6 OpenJDK 8 Bug — 漠然

Alpine 3.6 OpenJDK 8 Bug

2017/09/27 Docker

最近切换项目基础镜像踩到一个大坑,由于 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 <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"]

转载请注明出处,本文采用 CC4.0 协议授权

Search

    Post Directory