之前應該沒寫過用 Docker 結合 Go 語言編譯出最小 Image 的文章,剛好趁這機會來介紹。其實網路上可以直接找到文章,像是這篇『Building Minimal Docker Containers for Go Applications』,那本文來介紹 Docker 新功能 multi-stage builds,此功能只有在 17.05.0-ce 才支援,看起來是 2017/05/03 號會 release 出來。我們拿 Go 語言的 Hello World 來介紹 Single build 及 Multiple build。
Single build
底下是 Go 語言 Hello World 範例:
接著用 alpine 的 Go 語言 Image 來編譯出執行檔。
接著執行底下編譯指令:
最後檢查看看編譯出來的 Image 大小,使用 docker images | grep go-app
,會發現 Image 大小為 258 MB
Multiple build
Multiple build 則是可以在 Dockerfile
使用多個不同的 Image 來源,請看看底下範例
從上面可以看到透過 AS
及 --from
互相溝通,以前需要寫兩個 Dockerfile,現在只要一個就可以搞定。最後一樣執行編譯指令:
會發現最後大小為 6.35 MB,比上面是不是小了很多。
最小 Image?
6.35 MB 是最小的 Image 了嗎?才單單一個 Hello World 執行檔,用 Docker 包起來竟然要 6.35,其實不用這麼大,我們可以透過 Dokcer 所提供的最小 Image: scratch,將執行檔直接包進去即可,在編譯執行檔需加入特定參數才可以:
|
|
再透過 Docker 包起來
編譯出來大小為: 1.81MB,相信這是最小的 Image 了。最後用 Docker 來包
結論
Multiple build 非常方便,這樣就可以將多個步驟全部合併在一個 Dockerfile 處理掉,像是底下例子
|
|
用一個 Dockerfile 產生多個執行檔,最後再用 alpine 打包成 Image。
附上本篇程式碼範例
See also
- 用 10 分鐘了解 Go 語言如何從 Channel 讀取資料
- 用 Go 語言實現 Pub-Sub 模式
- Go 語言實作 Graceful Shutdown 套件
- 使用 AWS IAM Policy 設定 S3 Bucket 底下特定目錄權限
- 推薦自動化監控網站運行服務 - Gatus
- 使用 pyroscope adhoc 加速找到效能瓶頸
- Go 1.18 generics 新套件 constraints, slices 及 maps
- 初探 golang 1.18 generics 功能
- Introduction to Open Policy Agent 初探權限控管機制
- 用 Supervisor 管理系統程式