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

心中略有不甘,想搞清楚為何沒有,來探索一下;

  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,因此我覺得這樣做的難度太大...

對於第二種和第三種,后續的章節我們一起來實戰吧;

歡迎關注公眾號:程序員欣宸


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM