ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本
为什么需要ARM64架构的OpenJDK8的Docker镜像
对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行都是JDK8,如今在树莓派的Docker环境运行(也可能是其他ARM环境,如华为的泰山ARM服务器),需要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):
root@raspbian:~# echo $(dpkg --print-architecture)
arm64
- 看上图红框3中的代码,如果处理器架构是arm64,那么变量upstreamArch就等于aarch64;
- 看上图红框4中的代码,下载OpenJDK包的地址是${JAVA_BASE_URL}${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
- 在浏览器输入上述地址试试,发现浏览器返回的是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,因此我觉得这样做的难度太大...
对于第二种和第三种,后续的章节我们一起来实战吧;
欢迎关注公众号:程序员欣宸
ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本的更多相关文章
- Arm64架构下静态编译Nginx
这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中.这一源码构建模块可以将指定代码仓库中包含的源码,拉取构建成为容器镜像,在各种容器平台中运行.目前支持的 ...
- Arm64架构下编译便携Python
这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中.对于 Python 项目而言,可以直接通过源代码编译成为可运行在各种容器平台之上的容器镜像.这个过程不 ...
- node官方docker镜像运行bower 提示 permission denied 解决方法
在使用node官方docker镜像部署node应用时,应用需要npm的scripts中运行bower install 来安装前端包,但是用docker 构建时失败,提示 permission dein ...
- 花一分钟体验 Apache DolphinScheduler 第一个官方 Docker 镜像
先前Apache DolphinScheduler 社区一直是发布 Dockerfile 和 K8s Chart.yaml 文件,由用户自行 build 镜像.随着越来越多的用户伙伴们的呼声高涨,社区 ...
- ARM64架构下登录mysql出错:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file:
Linux下登录mysql出错:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared obj ...
- MySQL 官方 Docker 镜像的使用
首先是pull image,这里我拉取的是5.6.35: $ sudo docker pull mysql:5.6.35 拉下来以后大可以按照官方的说明无脑启动,但是外部无法访问,所以绑定端口: $ ...
- mysql 官方docker镜像使用教程
首先是pull image,这里我拉取的是5.x版本最新版: docker pull mysql:5 拉下来以后大可以按照官方的说明无脑启动,但是外部无法访问,所以绑定端口:docker run -- ...
- nginx 官方docker镜像使用教程
最近在看nignx,在本地虚拟机使用docker nginx镜像搭建了nginx+php环境 整理的教程如下: 拉取nginx镜像docker pull nginx 创建一个容器,并挂载本地目录doc ...
- ARM架构下的Docker环境,OpenJDK官方没有8版本镜像,如何完美解决?
为什么需要ARM架构下的OpenJDK8的Docker镜像? 对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行都是JDK8,如今在树莓派的Docker环境运行(或者其他ARM架构电脑 ...
随机推荐
- java必学技能
一:系统架构师是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节.扫清主要难点的技术人员.主要着眼于系统的“技术实现”.因此他/她应该是特定的开发平台.语言.工具的大师 ...
- CentOS7 安装 Pure-ftpd
博客地址:http://www.moonxy.com 一.摘要 FTP 是 File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议”.用于Intern ...
- APP稳定性测试
APP稳定性测试-monkey测试 第一篇-App稳定性测试-Monkey(基本操作) 准备工作 1.首先下载好adb工具 2.使用数据线连接电脑,打开usb调试 3.使用win+R打开运行, ...
- Windows server 2008 快速搭建域环境
之前根据网上的教程搭建,然后出现了很多问题,最后摸索出了一个比较稳妥一点的方法. 对于选系统这里,虽然上一篇文章已经说过了,这里也再强调一下,我使用的是08的系统,使用其他系统的暂不做评价,使用08系 ...
- Android Studio [Toast]
ToastActivity.java package com.xdw.a122; import android.support.v7.app.AppCompatActivity; import and ...
- js---电商中常见的放大镜效果
js中的放大镜效果 在电商中,放大镜效果是很常见的,如下图所示: 当鼠标悬浮时,遮罩所在区域在右侧进行放大. 在动手写之前,我们要先理清思路,分析需求,所需知识点,再将每一块进行组装,最后进行功能的完 ...
- sql server编写archive通用模板脚本实现自动分批删除数据
博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常 ...
- html盒模型基础
盒模型 概念:如果CSS对HTML文档元素生成了该元素在HTML文档布局中占据空间的矩形元素框(element box),称盒子 通过一系列定义盒子的 ...
- Spring 梳理 - 视图解析器 VS 视图(View,ViewResolver)
View View接口表示一个响应给用户的视图,例如jsp文件,pdf文件,html文件等 该接口只有两个方法定义,分别表明该视图的ContentType和如何被渲染 Spring中提供了丰富的视图支 ...
- FILETIME类型到LARGE_INTEGER类型的转换
核心编程第5版 245页到247页的讲到SetWaitableTimer函数的使用 其中提到 FILETIME类型到LARGE_INTEGER类型的转换问题,如下代码 //我们声明的局部变量 HAND ...