1. 前言
Spring Boot 2.3.0.RELEASE 正式發布了幾天了,其中有個新的特性:可以將Spring Boot應用代碼直接打包為Docker鏡像。這是什么科技?我趕緊去官網查了一番才知道用的是基於雲原生的Buildpacks技術,這是一個直接將代碼轉換為容器鏡像的技術,它意味着你不用在寫Dockerfile文件了。
但是 Spring Boot 2.3.0.RELEASE 的鏡像構建插件好像有BUG,等后續修復吧。但是本文的相關實踐並不采用官方的插件。
2. 靈魂追問
在了解這種技術之前,我們先想想我們開發的Java應用運行起來都需要什么?
- 首先你得編寫業務邏輯代碼吧,這是最基本的。
- 你的應用配置環境,也可以成為Profile,比如Spring Boot應用中
application.yml
的環境配置。 - 特定的語言環境,Java需要跑在JVM上, 其它語言也對應的需要它們的特定環境。
- 運行時環境,比如我們的Spring Boot應用還可能依賴其它中間件、第三方類庫等等。
如果我們有一種工具來處理這些問題就好了,我們可以快速的實現從源碼到運行時的工作流程。
3. 和Dockerfile相比
Buildpacks就是來解決這一問題的。這不是重復的輪子!與我們熟悉的Dockerfile相比,Buildpacks為構建應用程序提供了更高層次的構建抽象。
- 減輕了開發者的負擔,並支持大規模的應用程序的管理。
- 多語言支持,針對特定的編程語言有特定的一攬子構建機制,比如 Java、Golang、Ruby、Python等。
- 保證應用構建的安全性和合規性,而無需開發者干預。
- 提供操作系統級別和應用程序級別的依賴關系升級的自動交付,屏蔽了Dockerfile 的復雜性。
- 提供merge功能,讓我們可以在原來的基礎上增加新的功能和補丁,而無需重新構建。
2. 安裝Buildpacks
目前Buildpacks 支持 Linux、MacOS、Windows。你可以從 Buildpacks的官方文檔獲取詳細的安裝方法,因為過於簡單這里不再介紹。
別忘記配置 Buildpacks 的環境變量。在 Win10 上需要將 Buildpacks 的安裝目錄配置到 path 環境變量中。
如果Buildpacks 的路徑為 D:\pack-v0.10.0-windows\pack.exe
則:
然后命令行執行 pack version
,打印出版本號就表示安裝成功了。
安裝Buildpacks的先決條件是,擁有Docker運行時,你需要在對應操作系統上安裝並運行Docker 。
3. 從代碼構建Docker鏡像
這里我們使用一個標准的Spring Boot項目,在項目的根目錄下需要安裝 Maven wrapper。Maven Wrapper的作用是:發現用戶的Maven版本和期望的版本不一致,下載期望的版本,然后用期望的版本來執行mvn命令,安裝命令為:
mvn -N io.takari:maven:wrapper
一般從 Spring Initializr 生成的項目都自帶Maven wrapper。
完成上面的幾步之后。執行下面的命令構建Docker鏡像:
pack build myapp --builder cnbs/sample-builder:bionic
執行完畢后你的 Docker 鏡像就構建完畢了,甚至有需要的話你可以再追加 --publisher
命令將鏡像上傳到Docker鏡像倉庫。 和以往不同的是無需編寫Dockfile文件。
初次構建的時間可能會比較長,因為要安裝一些基礎設施,以后再構建就會快得多,因為會重用這些有用的緩存。有興趣的可以對比一下。
4. 總結
Buildpacks是CNCF基金會的孵化項目,此次Spring Boot 2.3.0.RELEASE和它的結合,是Spring Boot構建雲原生應用的重要里程碑。后面我會抽時間對Buildpacks進行進一步的介紹,敬請關注我的個人博客felord.cn。
關注公眾號:Felordcn 獲取更多資訊