写点什么

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

作者:程序员欣宸
  • 2022-10-26
    广东
  • 本文字数:1250 字

    阅读完需:约 4 分钟

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 的镜像

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


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

  2. 从上图的分析我们了解到 OpenJDK8 镜像制作过程:先获取当前宿主机的处理器架构,执行命令是 $(dpkg --print-architecture) ,在树莓派上执行此命令试试,如下,可见得到了 $(dpkg --print-architecture)


root@raspbian:~# echo $(dpkg --print-architecture)arm64
复制代码


  1. 看上图红框 3 中的代码,如果处理器架构是 arm64 ,那么变量 upstreamArch 就等于 aarch64

  2. 看上图红框 4 中的代码,下载 OpenJDK 包的地址是 {upstreamArch}linux${JAVA_URL_VERSION}.tar.gz ,这里面 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. 将上述地址中的 aarch64 替换成 x64 ,看看 X86 处理机架构下有没有 OpenJDK8 的下载包,新地址是:https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u222-b10/OpenJDK8U-jdk_x64_linux_8u222b10.tar.gz ,此地址可以顺利下载;

  3. 来看看 OpenJDK 官方为 JDK8 版本提供了哪些下载包,地址是:https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases ,如下图,清一色的 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,因此我觉得这样做的难度太大...


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

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...


发布于: 刚刚阅读数: 5
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018-04-19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本?_Java_程序员欣宸_InfoQ写作社区