基於alpine構建jdk映象遇到的坑
阿新 • • 發佈:2021-11-11
alpine
常用於作為docker
的基礎映象,因為它很小,功能精簡,基本上沒有啥漏洞,記錄一下最近用alpine
作為基礎映象構建java 8
映象 下面的問題在oracle jdk
openjdk
都會出現 。
錯誤一
java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager
這個錯誤一般出現在生成驗證碼繪製的時候,這個錯誤大概原因就是由於在alpine
上太過於精簡了,導致初始化FontManagerFactory
工廠初始化失敗,那麼解決辦法就是安裝glibc
。
網上有很多博主都只講安裝了glib.apk
2.3.0
為例 需要安裝的包為
- https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-2.30-r0.apk
- https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-bin-2.30-r0.apk
- https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-i18n-2.30-r0.apk
安裝命令如下
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/