爲何須要ARM64架構的OpenJDK8的Docker鏡像
對現有的Java應用,以前一直運行在x86處理器環境下,編譯和運行都是JDK8,現在在樹莓派的Docker環境運行(也多是其餘ARM環境,如華爲的泰山ARM服務器),須要JDK8鏡像做爲基礎鏡像。linux
OpenJDK的官方Dockerfile
去OpenJDK的docker鏡像官網查找找,地址是:https://hub.docker.com/r/arm6... ,以下圖,只有JDK11的鏡像:
git
爲啥沒有OpenJDK8的鏡像
心中略有不甘,想搞清楚爲什麼沒有,來探索一下;程序員
- 打開OpenJDK8的官方GitHub,去看鏡像的製做腳本Dockerfile的源碼,地址是:https://github.com/docker-lib... ,注意下圖的內容:
- 從上圖的分析咱們瞭解到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/AdoptOpenJ... ,此地址能夠順利下載;
- 來看看OpenJDK官方爲JDK8版本提供了哪些下載包,地址是:https://github.com/AdoptOpenJ... ,以下圖,清一色的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
對於第二種和第三種,後續的章節咱們一塊兒來實戰吧;segmentfault
歡迎關注公衆號:程序員欣宸