alpine能够如此小巧是因为它没有集成一些普通的Linux库,比如跑Java应用必须依赖的glibc相关的包,alpine linux构建oracle jdk时,需要先安装一些依赖库,oracle官网下载jre即可,无需下载jdk,否则构建的基础镜像过大,以下为Dockerfile
FROM alpine:3.18.5
ADD jdk.tar.gz /usr/local/jdk/
COPY locale.md /usr/local/locale.md
COPY glibc-2.34-r0.apk /tmp/glibc.apk
COPY glibc-bin-2.34-r0.apk /tmp/glibc-bin.apk
COPY glibc-i18n-2.34-r0.apk /tmp/glibc-i18n.apk
COPY gcc-libs-11.1.0-3-x86_64.pkg.tar /tmp/gcc-libs.tar
COPY zlib-1_1.2.11-4-x86_64.pkg.tar.xz /tmp/libz.tar
COPY sgerrand.rsa.pub /etc/apk/keys/sgerrand.rsa.pub
RUN echo http://mirrors.aliyun.com/alpine/v3.18/main/ > /etc/apk/repositories \
&& echo http://mirrors.aliyun.com/alpine/v3.18/community/ >> /etc/apk/repositories \
&& apk update && apk add --no-cache curl zlib wget bash tree tzdata binutils cronie openssl font-adobe-100dpi ttf-dejavu fontconfig \
&& rm -rf /var/cache/apk/* \
&& sed -i '1s?/bin/ash?/bin/bash?g' /etc/passwd\
&& sed -i 4d /etc/shells \
&& sed -i '2i/bin/bash' /etc/shells\
&& cd /tmp && apk add --force-overwrite glibc.apk glibc-i18n.apk glibc-bin.apk \
&& mkdir /tmp/gcc \
&& tar -xf /tmp/gcc-libs.tar -C /tmp/gcc \
&& mv /tmp/gcc/usr/lib/libgcc* /tmp/gcc/usr/lib/libstdc++* /usr/glibc-compat/lib \
&& strip /usr/glibc-compat/lib/libgcc_s.so.* /usr/glibc-compat/lib/libstdc++.so* \
&& cat /usr/local/locale.md | xargs -i /usr/glibc-compat/bin/localedef -i {} -f UTF-8 {}.UTF-8 \
&& mkdir /tmp/libz \
&& tar -xf /tmp/libz.tar -C /tmp/libz \
&& mv /tmp/libz/usr/lib/libz.so* /usr/glibc-compat/lib \
&& apk del binutils \
&& rm -rf /tmp/* /var/cache/apk/* /var/cache/fontconfig/* /usr/local/locale.md \
&& ulimit -c unlimited \
&& rm -rf /lib/libc.musl-x86_64.so.1 \
&& mv /usr/glibc-compat/lib/ld-linux-x86-64.so.2 /usr/glibc-compat/lib/ld-linux-x86-64.so \
&& ln -s /usr/glibc-compat/lib/ld-linux-x86-64.so /usr/glibc-compat/lib/ld-linux-x86-64.so.2 \
&& ln -s /usr/glibc-compat/lib/ld-linux-x86-64.so /lib/libc.musl-x86_64.so.1 \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' > /etc/timezone
#设置定时任务的文件 /etc/crontabs/root root是个文件
#处理生成图片验证码报错的问题
COPY libbrotlicommon.so.1.0.9 /usr/lib/
COPY libfontconfig.so.1.12.0 /usr/lib/
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN.UTF-8
ENV JAVA_HOME /usr/local/jdk
ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$PATH
CMD ["java","-version"]
COPY libbrotlicommon.so.1.0.9 /usr/lib/
COPY libfontconfig.so.1.12.0 /usr/lib/
alpine linux版本<=3.15,Dockerfile文件中可以省略这两个COPY命令,这两个COPY命令是处理alpine linux版本大于3.15后,若java应用中包含生成图形验证码相关代码,java应用报底层错误,导致应用停止验证码无法生成的问题
locale.md,sgerrand.rsa.pub,libbrotlicommon.so.1.0.9,libfontconfig.so.1.12.0文件免积分下载地址