1. 前言
Spring Boot 2.3.0.RELEASE 正式發(fā)布了幾天了特姐,其中有個新的特性:可以將Spring Boot應用代碼直接打包為Docker鏡像斤贰。這是什么科技稍刀?我趕緊去官網查了一番才知道用的是基于云原生的Buildpacks技術罢绽,這是一個直接將代碼轉換為容器鏡像的技術师逸,它意味著你不用在寫Dockerfile文件了津滞。
但是 Spring Boot 2.3.0.RELEASE 的鏡像構建插件好像有BUG,等后續(xù)修復吧锌唾。但是本文的相關實踐并不采用官方的插件锄码。
2. 靈魂追問
在了解這種技術之前,我們先想想我們開發(fā)的Java應用運行起來都需要什么晌涕?
- 首先你得編寫業(yè)務邏輯代碼吧滋捶,這是最基本的。
- 你的應用配置環(huán)境渐排,也可以成為Profile炬太,比如Spring Boot應用中
application.yml
的環(huán)境配置灸蟆。 - 特定的語言環(huán)境驯耻,Java需要跑在JVM上亲族, 其它語言也對應的需要它們的特定環(huán)境。
- 運行時環(huán)境可缚,比如我們的Spring Boot應用還可能依賴其它中間件霎迫、第三方類庫等等。
如果我們有一種工具來處理這些問題就好了帘靡,我們可以快速的實現從源碼到運行時的工作流程知给。
3. 和Dockerfile相比
Buildpacks就是來解決這一問題的。這不是重復的輪子描姚!與我們熟悉的Dockerfile相比涩赢,Buildpacks為構建應用程序提供了更高層次的構建抽象。
- 減輕了開發(fā)者的負擔轩勘,并支持大規(guī)模的應用程序的管理筒扒。
- 多語言支持,針對特定的編程語言有特定的一攬子構建機制绊寻,比如 Java花墩、Golang、Ruby澄步、Python等冰蘑。
- 保證應用構建的安全性和合規(guī)性,而無需開發(fā)者干預村缸。
- 提供操作系統級別和應用程序級別的依賴關系升級的自動交付祠肥,屏蔽了Dockerfile 的復雜性。
- 提供merge功能梯皿,讓我們可以在原來的基礎上增加新的功能和補丁搪柑,而無需重新構建。
2. 安裝Buildpacks
目前Buildpacks 支持 Linux索烹、MacOS工碾、Windows。你可以從 Buildpacks的官方文檔獲取詳細的安裝方法百姓,因為過于簡單這里不再介紹渊额。
別忘記配置 Buildpacks 的環(huán)境變量。在 Win10 上需要將 Buildpacks 的安裝目錄配置到 path 環(huán)境變量中垒拢。
如果Buildpacks 的路徑為 D:\pack-v0.10.0-windows\pack.exe
則:
然后命令行執(zhí)行 pack version
旬迹,打印出版本號就表示安裝成功了。
安裝Buildpacks的先決條件是求类,擁有Docker運行時奔垦,你需要在對應操作系統上安裝并運行Docker 。
3. 從代碼構建Docker鏡像
這里我們使用一個標準的Spring Boot項目尸疆,在項目的根目錄下需要安裝 Maven wrapper椿猎。Maven Wrapper的作用是:發(fā)現用戶的Maven版本和期望的版本不一致惶岭,下載期望的版本,然后用期望的版本來執(zhí)行mvn命令犯眠,安裝命令為:
mvn -N io.takari:maven:wrapper
一般從 Spring Initializr 生成的項目都自帶Maven wrapper按灶。
完成上面的幾步之后。執(zhí)行下面的命令構建Docker鏡像:
pack build myapp --builder cnbs/sample-builder:bionic
執(zhí)行完畢后你的 Docker 鏡像就構建完畢了筐咧,甚至有需要的話你可以再追加 --publisher
命令將鏡像上傳到Docker鏡像倉庫鸯旁。 和以往不同的是無需編寫Dockfile文件。
初次構建的時間可能會比較長量蕊,因為要安裝一些基礎設施铺罢,以后再構建就會快得多,因為會重用這些有用的緩存残炮。有興趣的可以對比一下畏铆。
4. 總結
Buildpacks是CNCF基金會的孵化項目,此次Spring Boot 2.3.0.RELEASE和它的結合吉殃,是Spring Boot構建云原生應用的重要里程碑辞居。后面我會抽時間對Buildpacks進行進一步的介紹,敬請關注我的個人博客felord.cn蛋勺。
關注公眾號:碼農小胖哥瓦灶,獲取更多資訊