通过上一篇 docker jdk基础镜像精简(带jps命令)第一弹的打包研究,用于x86的架构是没有问题的,但是由于公司的架构既有x86,又有arm,因此需要打两个架构的包;以下为我的打包过程遇到的几个问题(包含试错过程),如不想看可直接跳到结尾获取jdk镜像。
问题一:打arm架构的包,而我手头上外网只有x86的环境服务器?
解决方案:如何在x86架构下进行ARM镜像的构建与运行和 [用友技术中台]使用x86服务器编译ARM容器镜像的解决方案-云社区-华为云博文中所诉利用QEMU这个开源的仿真模拟器,执行以下命令即可正常运行arm架构的镜像构建:
docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes
问题二:基础镜像是apline,需要安装依赖glibc库(因为jdk运行是需要glibc库的,而apline镜像不包含这个依赖库),在网上找了一翻关于arm的glibc库,试了一些依赖包,打完镜像后,基本都是缺胳膊少腿,无法执行jps的命令,怎么办?
解决方案:通过在官网上查找发现,已经有包含glibc依赖库的最小基础镜像了,因此通过官网hub.docker.com搜索alpine-glibc,出现很多版本,选择支持x86和arm的版本
试了几个即提供x86又提供arm版本的镜像,以下为试过的不可用版本及最终确定的可用版本
ng:starudream/alpine-glibclatest(缺少locale文件及中文字符集)cyphernode/alpine-glibc-base v3.12.4_2.31-0(有locale文件,但缺少中文字符集)guisea/alpine-glibc2.33(Could not open '/lib/ld-linux-aarch64.so.1': No such file or directory)ok:tedli/alpine-glibc:3.14.0
问题三:我在x86架构服务器下怎么拉取到arm的镜像?
解决方案:参考了docker x86平台 拉取 arm版镜像博文,我选择了文中的第二种方式拉取:
#通过镜像的sha256值x86docker pull tedli/alpine-glibc:3.14.0@sha256:38f06462814329c5ad84d3f9e484e63019582664c7e1358f39defe1ef04162d2armdocker pull tedli/alpine-glibc:3.14.0@sha256:c69fba833fc8be8b5bdea60e9ef375b9a870970fdafc21540949d2083c714053
通过解决了以上三个问题之后,就可以顺利打jdk最小镜像了。
Dockerfile文件
# using alpine-glibc instead of alpineis mainly because JDK relies on glibc#分x86的基础镜像和arm的基础镜像#尝试过其他很多apline-glibc的镜像缺胳膊少腿的,不好用#这个基础镜像自带了ps netstat ip iostat top等命令,且包含了中文字符集C.UTF-8,中文不乱码,这是目前找到经过对比后非常棒的一个镜像#以下两种架构镜像需要按架构拉取再进行编译镜像#x86#docker pull tedli/alpine-glibc:3.14.0@sha256:38f06462814329c5ad84d3f9e484e63019582664c7e1358f39defe1ef04162d2#arm#docker pull tedli/alpine-glibc:3.14.0@sha256:c69fba833fc8be8b5bdea60e9ef375b9a870970fdafc21540949d2083c714053FROM tedli/alpine-glibc:3.14.0LABEL maintainer="xieja"LABEL time="2021-12-21 15:13:00"# set timezoneENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && \echo ${TZ} > /etc/timezone# A streamlined jreADD jre8-arm.tar.gz /usr/java/jdk/ADD testChineseDisplay.sh /# set envENV JAVA_HOME /usr/java/jdkENV PATH ${PATH}:${JAVA_HOME}/bin
注意:
1、jre包的区别:
jre8-arm.tar.gz 等于jre-8u311-linux-x64.tar.gz删除无用文件后加上jdk-8u311-linux-aarch64.tar.gz中的jps及tools.jar,
jre8.tar.gz 等于jre-8u311-linux-x64.tar.gz删除无用文件后加上jdk-8u311-linux-x64.tar.gz中的jps及tools.jar
打x86和arm的jdk镜像时导入的jre包要注意区分jre8.tar.gz和jre8-arm.tar.gz;
2、tedli/alpine-glibc:3.14.0的x86和arm都是同一个tag:
如果在同一个x86架构服务器下,需要区分引用,不然有可能打错镜像不可用,可以先打x86的jdk包,打完后,删除tedli/alpine-glibc:3.14.0镜像,通过镜像的sha256值拉取arm版本的镜像,再重新打jdk镜像包,这时打的就是arm版本的了;
以上为打包全过程,打出来的jdk镜像很小,x86的150M多,arm的140M多,内含基础命令ps、netstat、top、ip、jps、java等,支持中文日志打印(打镜像需要配置LANG=C.utf8)。
以下为打好的镜像(x86、arm),可自行获取,如果对你有帮助的话帮忙点的赞,谢谢啦,加班码完字,准备回家了。
百度网盘 请输入提取码:mitn