ARM64 架构下,OpenJDK 的官方 Docker 镜像为何没有 8 版本?
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
为什么需要 ARM64 架构的 OpenJDK8 的 Docker 镜像
对现有的 Java 应用,之前一直运行在 x86 处理器环境下,编译和运行都是 JDK8,如今在树莓派的 Docker 环境运行,需要 JDK8 镜像作为基础镜像。
OpenJDK 的官方 Dockerfile
去 OpenJDK 的 docker 镜像官网查找找,地址是:https://hub.docker.com/r/arm64v8/openjdk ,如下图,只有 JDK11 的镜像:
为啥没有 OpenJDK8 的镜像
心中略有不甘,想搞清楚为何没有,来探索一下;
打开 OpenJDK8 的官方 GitHub,去看镜像的制作脚本 Dockerfile 的源码,地址是:https://github.com/docker-library/openjdk/blob/master/8/jdk/Dockerfile ,注意下图的内容:
从上图的分析我们了解到 OpenJDK8 镜像制作过程:先获取当前宿主机的处理器架构,执行命令是 $(dpkg --print-architecture) ,在树莓派上执行此命令试试,如下,可见得到了 $(dpkg --print-architecture) :
看上图红框 3 中的代码,如果处理器架构是 arm64 ,那么变量 upstreamArch 就等于 aarch64 ;
看上图红框 4 中的代码,下载 OpenJDK 包的地址是 {upstreamArch}linux${JAVA_URL_VERSION}.tar.gz ,这里面 JAVA_BASE_URL、upstreamArch、JAVA_URL_VERSION 的值都已经确定了,于是真实的地址就是:
在浏览器输入上述地址试试,发现浏览器返回的是 404 错误,也就是说此地址无效;
将上述地址中的 aarch64 替换成 x64 ,看看 X86 处理机架构下有没有 OpenJDK8 的下载包,新地址是:https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u222-b10/OpenJDK8U-jdk_x64_linux_8u222b10.tar.gz ,此地址可以顺利下载;
来看看 OpenJDK 官方为 JDK8 版本提供了哪些下载包,地址是:https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases ,如下图,清一色的 x86 架构:
结论
OpenJDK 官方镜像的制作原理,是依据宿主机 CPU 架构去官方下载对应的 OpenJDK 安装包,再做成镜像,目前 OpenJKD8 的安装包并没有提供 ARM 版本,因此官方没有提供 ARM 版本的 OpenJDK8 的 Docker 镜像;
解决之道
现状是 OpenJDK 官方在 ARM64 架构不提供 8 版本的官方 Docker 镜像,解决此问题的思路有两个(个人观点,欢迎探讨)
自己编译一个 8 版本的 OpenJDK 安装包,以此来做 Docker 镜像;
Oracle 提供了 ARM 版本的 JDKD 安装包,以此包来做 Docker 镜像;
用 OpenJDK 的 11 版本,但是 11 和 8 的差异要自行处理;
对于第一种方式,自己编译 8 版本的 OpenJDK,难度太大(对我自己而言),因为编译 OpenJDK 需要低版本的 OpenJDK 作为编译工具,也就是说我要找到 ARM 版本的 OpenJDK7,才能编译 ARM 版本的 OpenJDK8,因此我觉得这样做的难度太大...
对于第二种和第三种,后续的章节我们一起来实战吧;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/2774ee1205fd64e6433559843】。文章转载请联系作者。
评论