Azure DevOps (八) 通過流水線編譯Docker鏡像

上一篇文章我們完成了最簡單的傳統部署:上傳應用到伺服器上使用守護進程進行應用的部署。

本篇文章我們開始研究容器化和流水線的協作。

在開始操作之前,我們首先需要準備一下我們的dockerfile,這裡我們依然還是使用前幾篇文章使用的項目,貼一下文件內容。

既然我們是使用的微軟的azure,所以我也就直接用了azure維護的jdk:zulu,我自己電腦上的jdk也是用的這個,因為我是M1晶片的mac,最一開始的時候官方並沒有ARM架構的JDK

但是微軟第一時間發行了zulu的ARM版本,我就一直用到了現在。

FROM  azul/zulu-openjdk-debian:8
COPY demo-app.jar /demo-app.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN
ENTRYPOINT exec java -jar demo-app.jar

接下來我們來創建一條新的release 流水線,這裡有個深坑,就是我們在選擇agent的時候一定要選對了,選linux的發行版,我最一開始沒注意這個問題

導致後執行docker build 的時候一直提示我平台不對,結果我一看執行的是docker.exe o(╥﹏╥)o

首選創建agent,上面選擇azure pipelines,下面選擇ubantu

 

接下來創建兩個Task,第一個task用來整理一下文件目錄,第二個task用來執行容器的編譯。

首先創建第一個task,我們需要把dockerfile和我們的應用放在同一目錄下。

我們在agent下創建一個bash任務,選擇在線腳本。

 

 

 

這裡我貼一下腳本的內容,主要就是從流水線編譯好的製品中,提取出Dockerfile和我們的應用程式放在統一目錄下。 

cd _my-devops
mkdir finaldir
pwd
ls
cd webhook
ls
mv demo-app.jar  ../finaldir
mv classes/Dockerfile ../finaldir
cd ../finaldir
ls
pwd

 

接下來我們創建第二個task,用來執行docker build

我們在agent下添加一個docker執行步驟,在右側搜索docker,進行添加 

 

添加完成之後,這裡有兩部分需要我們填,Container Repository我們暫時先留空,因為我手頭沒有合適的倉庫,我們本篇文章的重點放在鏡像的編譯工作上,

我們在commands配置項里輸入dockerfile的路徑,和命令的執行路徑,這裡我把路徑填寫為了上面我整理好的finaldir中去,如果你有需要指定的編譯參數可以

寫到Arguments中去,這裡還有一個tag,用來指定我們鏡像的版本,$(Build.BuildId)環境變數會獲取我們本次流水線的編譯號,例如我這用的是test-$(Build.BuildId)

那麼到時候就會生成類似:test-3的一個tag打在鏡像上,讓我們區分鏡像結果。

 

 

按照要求填完之後,我們啟動一下這個流水線看一下執行的效果。

從bash的執行結果中,我們可以看到,我們已經成功的整理好了文件目錄,把應用程式和dockerfile放在了同一個文件夾下。

 

 我們再來看一下dockerbuild的結果,azure成功的編譯出了我們的鏡像

 

 

 

 

 到這裡我們就成功的使用azure的流水線編譯出了第一個docker的鏡像,說實話踩了很多坑,尤其是一開始沒有選擇對agent的類型,卡了半天沒意識到這個問題,我一直以為是我dockerfile中FROM的基礎鏡像有問題,還去翻了半天源碼,看著源碼里那個debain發行版本懷疑了半天人生,最後才意識到可能是agent的問題o(╥﹏╥)o

下一篇我們會研究如何通過azure打通一個公網的docker倉庫,把我們編譯好的鏡像推送到倉庫去。