製作Docker鏡像,用來編譯OpenJDK11源碼

在《極簡,利用Docker僅兩行命令就能下載和編譯OpenJDK11》一文中,我們用以下命令實現了OpenJDK11源碼的編譯:

docker run --rm \
-it \
-v /usr/local/work/openjdksrc:/src \
bolingcavalry/buildopenjdk11:0.0.2
1
2
3
4
今天我們就來看下Docker鏡像bolingcavalry/buildopenjdk11:0.0.2的製作過程,看看它做了哪些事情來簡化下載過程;

參考文章
如果您打算在真實Linxu環境下編譯OpenJDK11源碼,可以參照《Ubuntu環境編輯OpenJDK11源碼》;

環境信息
操作系統:Ubuntu 16.04.5 LTS;
Docker:18.06.1-ce;
準備材料
本次鏡像用到了以下材料:

Dockerfile:製作Docker鏡像的腳本文件;
cmd.sh:容器啓動後執行的命令腳本;
jdk10安裝包,在編譯OpenJDK11的時候,需要先裝好jdk10作爲bootjdk;
source.list:linux源;
您可以選擇直接從GitHub下載上述所有內容,地址和鏈接信息如下表所示:

名稱    鏈接    備註
項目主頁    https://github.com/zq2599/buildopenjdk11    該項目在GitHub上的主頁
git倉庫地址(https)    https://github.com/zq2599/buildopenjdk11.git    該項目源碼的倉庫地址,https協議
git倉庫地址(ssh)    [email protected]:zq2599/buildopenjdk11.git    該項目源碼的倉庫地址,ssh協議
要注意的問題
jdk10安裝文件jdk-10_linux-x64_bin_ri.tar.gz有186兆,因此做成的鏡像也很大,用戶下載鏡像時,一旦網絡問題下載失敗,docker會自動重試,此時是重新下載,這意味着之前的下載都白做了,爲了緩解這個問題,可以把文件分割成多個小文件,這樣雖然整體大小不變,但失敗時重下載的文件是很小的,在linux環境執行以下命令,將文件分割成多個最大10兆的文件:

split -b 10m jdk-10_linux-x64_bin_ri.tar.gz jdk-10_linux-x64_bin_ri-
1
編寫Dockerfile
Dockerfile內容如下,主要是安裝必要的應用,另外關鍵的操作都有詳細的註釋,就不多說了:

#Docker image of source for OpenJDK
# VERSION 0.0.1
# Author: bolingcavalry

#基礎鏡像使用ubuntu:16.04
FROM ubuntu:16.04

#作者
MAINTAINER BolingCavalry <[email protected]>

#定義boot jdk文件名
ENV BOOT_JDK_FILE_NAME jdk-10_linux-x64_bin_ri

#定義boot jdk安裝目錄
ENV BOOT_JDK_PATH /usr/lib/jvm

#定義boot jdk解壓後的包名
ENV BOOT_JDK_PACKAGE_NAME jdk-10

#boot jdk的完全路徑
ENV BOOT_JDK_HOME $BOOT_JDK_PATH/$BOOT_JDK_PACKAGE_NAME

#boot jdk相關的環境變量
ENV JAVA_HOME $BOOT_JDK_HOME
ENV JRE_HOME $BOOT_JDK_HOME/jre
ENV CLASSPATH .:$BOOT_JDK_HOME/lib:$JRE_HOME/lib
ENV PATH=$BOOT_JDK_HOME/bin:$PATH

#創建文件夾用於安裝boot jdk
RUN mkdir $BOOT_JDK_PATH

#將分割好的boot jdk安裝文件逐個複製到鏡像中,分多步完成,這樣下載過程中出現問題時,不至於全部重新開始下載
COPY ./$BOOT_JDK_FILE_NAME-ac $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ag $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ak $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ao $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-as $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ad $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ah $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-al $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ap $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-aa $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ae $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ai $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-am $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-aq $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ab $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-af $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-aj $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-an $BOOT_JDK_PATH/
COPY ./$BOOT_JDK_FILE_NAME-ar $BOOT_JDK_PATH/

#還原成完整的文件,再解壓開,將boot JDK配置信息寫入環境變量,創建jre目錄,把lib放進去
RUN cat $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME-* > $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME.tar.gz \
&& tar -zxvf $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME.tar.gz -C $BOOT_JDK_PATH \
&& rm $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME.tar.gz \
&& rm $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME-* \
&& mkdir $BOOT_JDK_HOME/jre \
&& cp -r $BOOT_JDK_HOME/lib $BOOT_JDK_HOME/jre/

#備份舊的源
RUN mv /etc/apt/sources.list /etc/apt/sources.list.backup

#複製新的源
COPY ./sources.list /etc/apt/

#apt更新
RUN apt-get update \
&& apt-get install -y file autoconf zip libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfontconfig1-dev libasound2-dev

#命令行文件複製到工作目錄
COPY ./cmd.sh /

#賦予可執行權限
RUN chmod a+x /cmd.sh

#啓動執行
#CMD ["/bin/bash", "/cmd.sh"]
ENTRYPOINT ["/cmd.sh"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
看到這裏您一定會有疑問:這麼多行COPY命令,爲什麼不用BOOT_JDK_FILE_NAME-*,這樣豈不是一行命令就夠了?
您可以在鏡像build成功後,用docker history命令看看文件的layer數量,用多個COPY命令逐個執行,每個命令都對應一個小的layer,這樣用戶下載鏡像時就是在下載多個小文件了;

cmd.sh文件
cmd.sh的內容如下,可見當容器啓動後,先完成configure,再執行make命令進行編譯:

#!/bin/bash
#修改所屬人和所屬羣組
echo "start chown and chgrp"
chown -R root /src/jdk11 && chgrp -R root /src/jdk11

cd /src/jdk11

#配置
echo "start configure"
bash /src/jdk11/configure

#開始編譯,如果有入參,就作爲make的參數
echo "start make"

if [ $# -gt 0 ]; then
   echo "make param is "$1
   make $1
else
   make
fi

echo "Compile successful!"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
source.list
這是構建鏡像時,更新Ubuntu的時候用到的源,您可以自行從網上搜索,或者用我的git上的;

構建鏡像
準備好上述材料後,整個文件夾應該是如下內容:

現在,在Dockerfile文件所在目錄執行以下命令即可構建好鏡像文件:

docker build -t bolingcavalry/buildopenjdk11:0.0.2 .
1
至此,鏡像製作完畢,可以直接通過docker run命令來編譯構建自己的OpenJDK了,相比在真實Linux環境編譯,此方式更爲簡單方便;
--------------------- 
作者:博陵精騎 
來源:CSDN 
原文:

https://bcy.net/u/108606832643
https://bcy.net/u/107854206578
https://bcy.net/u/107853573461
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章