1. 程式人生 > 其它 >基於alpine構建jdk映象遇到的坑

基於alpine構建jdk映象遇到的坑

alpine常用於作為docker的基礎映象,因為它很小,功能精簡,基本上沒有啥漏洞,記錄一下最近用alpine作為基礎映象構建java 8映象 下面的問題在oracle jdkopenjdk都會出現 。

錯誤一

java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager

  這個錯誤一般出現在生成驗證碼繪製的時候,這個錯誤大概原因就是由於在alpine上太過於精簡了,導致初始化FontManagerFactory工廠初始化失敗,那麼解決辦法就是安裝glibc
網上有很多博主都只講安裝了glib.apk

核心包就行,其實這裡需要安裝3個包 以2.3.0為例 需要安裝的包為

安裝命令如下

apk --no-cache add libstdc++ ca-certificates bash  wget
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-2.30-r0.apk
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-bin-2.30-r0.apk
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-i18n-2.30-r0.apk
apk add glibc-2.30-r0.apk && apk add glibc-bin-2.30-r0.apk && apk add glibc-i18n-2.30-r0.apk

  

安裝完後就沒有問題了,測試方法 可以寫一個main方法在容器中驗證是否能執行通過Class.forName("sun.awt.X11FontManager");,當在驗證碼不可行環境的時候 報錯的訊息為

/usr/local/jdk1.8.0_301/jre/lib/amd64/libfontmanager.so: libgcc_s.so.1: cann......

還有就是可以進入在執行中的容器直接安裝 安裝完成了之後基本上就沒有問題了。

錯誤二

該錯誤在openJDK中出現過,OracleJDK沒有出現。

error while loading shared libraries: libz.so.1: cannot open shared object file:

  解決方式就安裝zlib 安裝命令如下

curl -Ls https://archive.archlinux.org/packages/z/zlib/zlib-1%3A1.2.9-1-x86_64.pkg.tar.xz -o libz.tar.xz && mkdir -p libz && tar -xf libz.tar.xz -C libz

mv libz/usr/lib/libz.so* /usr/glibc-compat/lib

rm -rf libz.tar.xz

  安裝好後 沒有問題了

dragonwell openjdk Dockerfile

另貼上基於alpine的阿里dragonwell openjdk的Dockerfile

dragonwell JDK Dockerfile

FROM alpine:3.8
LABEL maintainer="xstao"
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && \
    echo ${TZ} > /etc/timezone
#mirrons aliun
RUN echo http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories && \
    echo http://mirrors.aliyun.com/alpine/v3.10/community/ >> /etc/apk/repositories
    RUN apk update && apk upgrade
#install glibc
RUN apk --no-cache add libstdc++ ca-certificates bash  wget curl  && \
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub  && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-2.30-r0.apk && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-bin-2.30-r0.apk && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-i18n-2.30-r0.apk && \
    apk add glibc-2.30-r0.apk && apk add glibc-bin-2.30-r0.apk && apk add glibc-i18n-2.30-r0.apk && \
    curl -Ls https://archive.archlinux.org/packages/z/zlib/zlib-1%3A1.2.9-1-x86_64.pkg.tar.xz -o libz.tar.xz && mkdir -p libz && tar -xf libz.tar.xz -C libz && \
    mv libz/usr/lib/libz.so* /usr/glibc-compat/lib && \
    rm glibc-2.30-r0.apk && rm glibc-bin-2.30-r0.apk && rm glibc-i18n-2.30-r0.apk && rm -rf /var/cache/apk/* && rm -rf libz/* &&  rm -rf libz.tar.xz


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


ENV JAVA_VERSION="jdk8u302-b01"
ENV JAVA_HOME="/usr/local/${JAVA_VERSION}"

ENV PATH="${JAVA_HOME}/bin:${PATH}"
# 
WORKDIR /opt
RUN wget https://dragonwell.oss-cn-shanghai.aliyuncs.com/8.8.9/Alibaba_Dragonwell_8.8.9_x64_linux.tar.gz
RUN tar -zxf Alibaba_Dragonwell_8.8.9_x64_linux.tar.gz
RUN mv ${JAVA_VERSION} /usr/local
RUN rm -rf Alibaba_Dragonwell_8.8.9_x64_linux.tar.gz

  

轉載請註明出處。

作者:peachyy

出處:http://www.cnblogs.com/peachyy/