为何须要ARM64架构的OpenJDK8的Docker镜像
对现有的Java应用,以前一直运行在x86处理器环境下,编译和运行都是JDK8,现在在树莓派的Docker环境运行(也多是其余ARM环境,如华为的泰山ARM服务器),须要JDK8镜像做为基础镜像。linux
OpenJDK的官方Dockerfile
去OpenJDK的docker镜像官网查找找,地址是:https://hub.docker.com/r/arm64v8/openjdk ,以下图,只有JDK11的镜像:
git
为啥没有OpenJDK8的镜像
心中略有不甘,想搞清楚为什么没有,来探索一下;程序员
- 打开OpenJDK8的官方GitHub,去看镜像的制做脚本Dockerfile的源码,地址是:https://github.com/docker-library/openjdk/blob/master/8/jdk/Dockerfile ,注意下图的内容:

- 从上图的分析咱们了解到OpenJDK8镜像制做过程:先获取当前宿主机的处理器架构,执行命令是<font color="blue">$(dpkg --print-architecture)</font>,在树莓派上执行此命令试试,以下,可见获得了<font color="blue">$(dpkg --print-architecture)</font>:
root@raspbian:~# echo $(dpkg --print-architecture)
arm64
- 看上图红框3中的代码,若是处理器架构是<font color="blue">arm64</font>,那么变量<font color="blue">upstreamArch</font>就等于<font color="blue">aarch64</font>;
- 看上图红框4中的代码,下载OpenJDK包的地址是<font color="blue">${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
- 在浏览器输入上述地址试试,发现浏览器返回的是404错误,也就是说此地址无效;
- 将上述地址中的<font color="blue">aarch64</font>替换成<font color="blue">x64</font>,看看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镜像;github
解决之道
现状是OpenJDK官方在ARM64架构不提供8版本的官方Docker镜像,解决此问题的思路有两个(我的观点,欢迎探讨)docker
- 本身编译一个8版本的OpenJDK安装包,以此来作Docker镜像;
- Oracle提供了ARM版本的JDKD安装包,以此包来作Docker镜像;
- 用OpenJDK的11版本,可是11和8的差别要自行处理;
对于第一种方式,本身编译8版本的OpenJDK,难度太大(对我本身而言),由于编译OpenJDK须要低版本的OpenJDK做为编译工具,也就是说我要找到ARM版本的OpenJDK7,才能编译ARM版本的OpenJDK8,所以我以为这样作的难度太大...shell
对于第二种和第三种,后续的章节咱们一块儿来实战吧;浏览器
欢迎关注公众号:程序员欣宸