容器Jenkins中執行docker - 2.Docker | 製作屬於自己的 Jenkins 映象
有時候我們可能需要為了滿足自己的需求來製作自己的 Docker 映象。
前言
最近我在使用 Docker 搭建 Jenkins 自動化構建平臺時遇到了各種環境問題,例如在 Jenkins 官方的映象內是沒有 maven、Android SDK、npm 等環境的,自然也就沒法使用 Jenkins 來構建編譯我們的專案,這裡有三種解決辦法:
1. 直接進入到 Jenkins 容器內部安裝相關環境。
需要注意的是,安裝相關相關環境後要確保容器不能被刪除,容易一旦被刪除,那麼裡面所做的變更都消失了,所以不推薦。
2. 在宿主機上安裝相關環境,然後通過 Docker 掛載卷的形式對映到容器內部。
這種方式如果宿主機有相關環境是非常方便的,可以直接環境的位置以掛載卷的形式對映到容器內部讓容器能訪問到宿主機的環境,但缺點也很明顯,如果需要將 Jenkins 遷移到其他伺服器上,那麼這些環境是沒法遷移的,需要到遷移的伺服器上再安裝一遍的,所以綜上兩種方式有了下面的第三種方式。
3. 將相關環境直接打包進 Jenkins 映象中。
這種方式需要我們在官方 Jenkins 映象的基礎上定製屬於我們自己的 Jenkins 映象,和第一種方式一樣,環境是安裝在容器內部的,但是不同的是容器若被刪除,下次重新建立容器的時候環境都是還在的,因為環境安裝在 Image 映象內部的。所以遷移也很方便,只需要把製作好的映象上傳到 DockerHub 上,然後其他伺服器需要使用的話只需要將映象拉取下來即可。
映象製作
下面就來一步一步製作我們的 Jenkins 映象,分別演示將 Maven、Android SDK、Node.js 環境打包到映象中。
編寫 Dockerfile 檔案
首先建立我們的 Dockerfile 檔案,然後編寫。
-
選定基礎映象
這裡我們使用 Jenkins 官方提供的 Jenkins 映象作為基礎映象。
FROM jenkins/jenkins:lts
-
安裝必要的輔助工具
因為後面涉及到 zip 壓縮包下載、解壓操作,所以我們需要先安裝
curl
、unzip
命令。RUN apt-get update \ && echo Y | apt-get install curl \ && apt-get install unzip
-
安裝 Maven 環境
ARG MAVEN_URL="http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip" ARG USER_LOCAL="/usr/local" ENV MAVEN_HOME="$USER_LOCAL/maven" RUN cd $MAVEN_HOME \ && curl -o maven.zip $MAVEN_URL \ && unzip maven.zip \ && rm maven.zip
ARG
:用於定義常量,僅在當前 Dockerfile 有效。ENV
:也是定於常量,當時在構建映象時,會作為環境變數打到映象內部。curl -o
:下載檔案。
-
安裝 Android SDK 環境
ARG USER_LOCAL="/usr/local" ARG SDK_MANAGER_URL="https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip" ENV ANDROID_HOME="$USER_LOCAL/Android/sdk" RUN cd $ANDROID_HOME \ && curl -o sdk.zip $SDK_MANAGER_URL \ && unzip sdk.zip \ && rm sdk.zip \ && cd tools \ && echo Y | $ANDROID_HOME/tools/bin/sdkmanager "extras;android;m2repository" "platform-tools" "platforms;android-28" "build-tools;28.0.3" "cmake;3.10.2.4988404"
echo Y
:因為有些操作需要使用者輸入 Y/n 確認,所以這句的意思是代替使用者輸入 Y。
這裡我們使用 Andoird 提供的命令列工具 sdkmanager 去安裝 sdk,這裡我們安裝了 android-28、build-tools 28.0.3 版本,以及 cmake。
可以使用
sdkmanager list
可以檢視所有可安裝的環境。詳細的 sdkmanager 使用可以檢視官方文件。
-
安裝 Node.js 環境
安裝 Node.js 的命令是通過 apt 來安裝的,詳見官方文件。
RUN curl -sL https://deb.nodesource.com/setup_11.x | bash - \ && apt-get install -y nodejs
-
將各環境新增到系統環境變數中
ENV PATH $MAVEN_HOME/apache-maven-3.6.3/bin:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmake/3.10.2.4988404/bin:$PATH
-
最後做一些清理操作
儘量在映象中不要放一些冗餘的無用檔案,所以需要做一些清理操作。
RUN apt-get clean
-
完整的 Dockerfile 檔案
FROM jenkins/jenkins:lts USER root ARG USER_LOCAL="/usr/local" ARG SDK_MANAGER_URL="https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip" ARG MAVEN_URL="http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip" ENV ANDROID_HOME="$USER_LOCAL/Android/sdk" ENV MAVEN_HOME="$USER_LOCAL/maven" RUN mkdir -p $ANDROID_HOME \ && mkdir -p $MAVEN_HOME \ && apt-get update \ && echo Y | apt-get install curl \ && apt-get install unzip \ && cd $MAVEN_HOME \ && curl -o maven.zip $MAVEN_URL \ && unzip maven.zip \ && rm maven.zip \ && cd $ANDROID_HOME \ && curl -o sdk.zip $SDK_MANAGER_URL \ && unzip sdk.zip \ && rm sdk.zip \ && cd tools \ && echo Y | $ANDROID_HOME/tools/bin/sdkmanager "extras;android;m2repository" "platform-tools" "platforms;android-28" "build-tools;28.0.3" "cmake;3.10.2.4988404" \ && curl -sL https://deb.nodesource.com/setup_11.x | bash - \ && apt-get install -y nodejs ENV PATH $MAVEN_HOME/apache-maven-3.6.3/bin:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmake/3.10.2.4988404/bin:$PATH RUN apt-get clean
Docker 映象分層儲存結構,層數是有限制的,Dockerfile 中每個命令將作為一層,所以儘量將可放在一起一些操作放在一個命令內,例如上面不必寫很多
RUN
,將命令放在一起會更好,瞭解更多寫法可參考這裡。
構建映象
docker build -t my_jenkins .
-t
:指定映象名。
最後的 . 不要忘記,用於指定構建上下文環境,如果 Dockerfile 檔案沒有問題,那麼構建應該是沒有問題的,其中安裝 Android SDK 可能需要耗時一點。
上傳映象到 DockerHub
-
註冊 DockerHub 賬號
想要上傳映象到DockerHub需要提前註冊一個賬號。
-
在本地登入 DockerHub 賬號
docker login
可使用上面的命令按照提示登入你的賬號
-
推送剛剛構建的映象
docker tag my_jenkins imhanjie/my_jenkins docker push my_jenkins
這裡需要注意的是,在
push
之前,肯定是要推送到自己的倉庫,所以根據映象名稱的規則,需要在映象前面加上你自己的 DockerHub 的使用者名稱,這樣才會推送到你的倉庫下,指定使用者名稱的形式就是your_username/image_name
,我的 DockerHub 名字是imhanjie
,所以首先根據本地的my_jenkis
映象新增一個 tag,名稱為imhanjie/my_jenkins
,然後push
就可以了,最後就可以在 DockerHub 上看見自己剛剛推送的映象了。