docker jdk基础镜像精简(x86和arm架构)踩坑 第二弹

        通过上一篇 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的版本

docker jdk基础镜像精简(x86和arm架构)踩坑 第二弹_第1张图片

试了几个即提供x86又提供arm版本的镜像,以下为试过的不可用版本及最终确定的可用版本

ng:
starudream/alpine-glibc        latest          (缺少locale文件及中文字符集)
cyphernode/alpine-glibc-base   v3.12.4_2.31-0  (有locale文件,但缺少中文字符集)
guisea/alpine-glibc            2.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值
x86
docker pull tedli/alpine-glibc:3.14.0@sha256:38f06462814329c5ad84d3f9e484e63019582664c7e1358f39defe1ef04162d2
arm
docker pull tedli/alpine-glibc:3.14.0@sha256:c69fba833fc8be8b5bdea60e9ef375b9a870970fdafc21540949d2083c714053

通过解决了以上三个问题之后,就可以顺利打jdk最小镜像了。

Dockerfile文件

# using alpine-glibc instead of alpine  is 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:c69fba833fc8be8b5bdea60e9ef375b9a870970fdafc21540949d2083c714053
FROM tedli/alpine-glibc:3.14.0

LABEL maintainer="xieja"
LABEL time="2021-12-21 15:13:00"

# set timezone
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && \
    echo ${TZ} > /etc/timezone
# A streamlined jre
ADD jre8-arm.tar.gz /usr/java/jdk/
ADD testChineseDisplay.sh /
# set env
ENV JAVA_HOME /usr/java/jdk
ENV 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

你可能感兴趣的:(docker,docker,arm,架构,linux,java)