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

对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行都是JDK8,如今在树莓派的Docker环境运行(也可能是其他ARM环境,如华为的泰山ARM服务器),需要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包的地址是${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
  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,因此我觉得这样做的难度太大...

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

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

ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本的更多相关文章

  1. Arm64架构下静态编译Nginx

    这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中.这一源码构建模块可以将指定代码仓库中包含的源码,拉取构建成为容器镜像,在各种容器平台中运行.目前支持的 ...

  2. Arm64架构下编译便携Python

    这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中.对于 Python 项目而言,可以直接通过源代码编译成为可运行在各种容器平台之上的容器镜像.这个过程不 ...

  3. node官方docker镜像运行bower 提示 permission denied 解决方法

    在使用node官方docker镜像部署node应用时,应用需要npm的scripts中运行bower install 来安装前端包,但是用docker 构建时失败,提示 permission dein ...

  4. 花一分钟体验 Apache DolphinScheduler 第一个官方 Docker 镜像

    先前Apache DolphinScheduler 社区一直是发布 Dockerfile 和 K8s Chart.yaml 文件,由用户自行 build 镜像.随着越来越多的用户伙伴们的呼声高涨,社区 ...

  5. 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 ...

  6. MySQL 官方 Docker 镜像的使用

    首先是pull image,这里我拉取的是5.6.35: $ sudo docker pull mysql:5.6.35 拉下来以后大可以按照官方的说明无脑启动,但是外部无法访问,所以绑定端口: $ ...

  7. mysql 官方docker镜像使用教程

    首先是pull image,这里我拉取的是5.x版本最新版: docker pull mysql:5 拉下来以后大可以按照官方的说明无脑启动,但是外部无法访问,所以绑定端口:docker run -- ...

  8. nginx 官方docker镜像使用教程

    最近在看nignx,在本地虚拟机使用docker nginx镜像搭建了nginx+php环境 整理的教程如下: 拉取nginx镜像docker pull nginx 创建一个容器,并挂载本地目录doc ...

  9. ARM架构下的Docker环境,OpenJDK官方没有8版本镜像,如何完美解决?

    为什么需要ARM架构下的OpenJDK8的Docker镜像? 对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行都是JDK8,如今在树莓派的Docker环境运行(或者其他ARM架构电脑 ...

随机推荐

  1. 【最新】破解微信小程序,获取微信小程序源码,破解微信wxapkg,仅需5秒

    一个后端第一次接触iview,就简单写了个网站. 之前看到有人发解析wx小程序源码包的软件,但是因为微信的升级,之前的办法已经不行了.现在重新改了js文件,适配了最新的版本. 之前微信wxapkg包获 ...

  2. 提供就医帮助的安卓APP

    首先 这是我们团队第一次开发安卓APP,也是我 个人第一个开发项目APP,俗话说:“万事开头难”.所以对于新手的我们来说,做好开发前的准备至关重要.凡事预则立不预则废! 首先我们团队这次开发的提供就医 ...

  3. 关于W3Cschool定义的设计模式-常用的9种设计模式的介绍

    一.设计模式 tip:每种设计模式,其实都是为了更高效的,更方便的解决在面对对象编程中所遇到的问题. 什么是设计模式:     是一套经过反复使用.多人知晓的.经过分类的.代码设计经验的总结   为什 ...

  4. ASP.NET Core 3.0 gRPC 双向流

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 认证授权 一.前言 在前一文 <ASP.NE ...

  5. 微信小程序中的tabBar设置

    我们先来看一份图,这个设置在官方文档中已经写得很清楚了,我只是做一个总结 注:我写注释是为了方便说明,在小程序中的json文件中是不能用注释的 这个tabBar属于全局属性,因此就在全局配置文件app ...

  6. LoadRuuner资源监控

    用ipconfig命令查看IP地址的具体方法.初级工程师面试常面临的问题:网址:http://url.cn/5BaDWvB本机IP:172.0.0.1localhostipconfig命令c查看本机I ...

  7. 环境搭建-CentOS集群搭建

    环境搭建-CentOS集群搭建 写在前面 最近有许多小伙伴问我,大数据的hadoop分布式集群该如何去搭建.所以,想着,就写一篇博客,帮助到更多刚入门大数据的人.本博客会一步一步带你实现一个Hadoo ...

  8. 提交第一个spark作业到集群运行

    写在前面 接触spark有一段时间了,但是一直都没有真正意义上的在集群上面跑自己编写的代码.今天在本地使用scala编写一个简单的WordCount程序.然后,打包提交到集群上面跑一下... 在本地使 ...

  9. C#控件及常用属性

    1.窗体(Form) 1.常用属性 (1)Name 属性:用来获取或设置窗体的名称,在应用程序中可通过Name 属性来引用窗体. (2) WindowState 属性: 用来获取或设置窗体的窗口状态. ...

  10. 基于SpringBoot + Mybatis实现 MVC 项目

    1.预览: (1)完整项目结构 (2) 创建数据库.数据表: [user.sql] SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- ...