為什么需要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-librar ... er/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/ ... nux_8u222b10.tar.gz ,此地址可以順利下載;
- 來看看OpenJDK官方為JDK8版本提供了哪些下載包,地址是:https://github.com/AdoptOpenJDK/ ... m-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,因此我覺得這樣做的難度太大...
對於第二種和第三種,后續的章節我們一起來實戰吧;
更多學習資料可關注:gzitcast