ARM64架构下OpenJDK的官方Docker镜像为何没有8版本

96次阅读

共计 1723 个字符,预计需要花费 5 分钟才能阅读完成。

为什么需要 ARM64 架构的 OpenJDK8 的 Docker 镜像

对现有的 Java 应用,之前一直运行在 x86 处理器环境下,编译和运行都是 JDK8,如今在树莓派的 Docker 环境运行 (也可能是其他 ARM 环境,如华为的泰山 ARM 服务器),需要 JDK8 镜像作为基础镜像。

OpenJDK 的官方 Dockerfile

去 OpenJDK 的 docker 镜像官网查找找,地址是:https://hub.docker.com/r/arm6…,如下图,只有 JDK11 的镜像:

为啥没有 OpenJDK8 的镜像

心中略有不甘,想搞清楚为何没有,来探索一下;

  1. 打开 OpenJDK8 的官方 GitHub,去看镜像的制作脚本 Dockerfile 的源码,地址是:https://github.com/docker-lib…,注意下图的内容:

  1. 从上图的分析我们了解到 OpenJDK8 镜像制作过程:先获取当前宿主机的处理器架构,执行命令是 <font color=”blue”>$(dpkg –print-architecture)</font>,在树莓派上执行此命令试试,如下,可见得到了 <font color=”blue”>$(dpkg –print-architecture)</font>:
root@raspbian:~# echo $(dpkg --print-architecture)
arm64
  1. 看上图红框 3 中的代码,如果处理器架构是 <font color=”blue”>arm64</font>,那么变量 <font color=”blue”>upstreamArch</font> 就等于 <font color=”blue”>aarch64</font>;
  2. 看上图红框 4 中的代码,下载 OpenJDK 包的地址是 <font color=”blue”>&dollar;{JAVA_BASE_URL}${upstreamArch}_linux_${JAVA_URL_VERSION}.tar.gz</font>,这里面 JAVA_BASE_URL、upstreamArch、JAVA_URL_VERSION 的值都已经确定了,于是真实的地址就是:
https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u222-b10/OpenJDK8U-jdk_aarch64_linux_8u222b10.tar.gz
  1. 在浏览器输入上述地址试试,发现浏览器返回的是 404 错误,也就是说此地址无效;
  2. 将上述地址中的 <font color=”blue”>aarch64</font> 替换成 <font color=”blue”>x64</font>,看看 X86 处理机架构下有没有 OpenJDK8 的下载包,新地址是:https://github.com/AdoptOpenJ…,此地址可以顺利下载;
  3. 来看看 OpenJDK 官方为 JDK8 版本提供了哪些下载包,地址是:https://github.com/AdoptOpenJ…,如下图,清一色的 x86 架构:

结论

OpenJDK 官方镜像的制作原理,是依据宿主机 CPU 架构去官方下载对应的 OpenJDK 安装包,再做成镜像,目前 OpenJKD8 的安装包并没有提供 ARM 版本,因此官方没有提供 ARM 版本的 OpenJDK8 的 Docker 镜像;

解决之道

现状是 OpenJDK 官方在 ARM64 架构不提供 8 版本的官方 Docker 镜像,解决此问题的思路有两个 (个人观点,欢迎探讨)

  1. 自己编译一个 8 版本的 OpenJDK 安装包,以此来做 Docker 镜像;
  2. Oracle 提供了 ARM 版本的 JDKD 安装包,以此包来做 Docker 镜像;
  3. 用 OpenJDK 的 11 版本,但是 11 和 8 的差异要自行处理;

对于第一种方式,自己编译 8 版本的 OpenJDK,难度太大 (对我自己而言),因为编译 OpenJDK 需要低版本的 OpenJDK 作为编译工具,也就是说我要找到 ARM 版本的 OpenJDK7,才能编译 ARM 版本的 OpenJDK8,因此我觉得这样做的难度太大 …

对于第二种和第三种,后续的章节我们一起来实战吧;

欢迎关注公众号:程序员欣宸

正文完
 0