slimage:為 Go 語言應用創建最小化的 Docker 鏡像

BarP81 8年前發布 | 9K 次閱讀 Docker

slimage

為 Go 語言應用創建最小化的 Docker 鏡像。

背景

Docker 已經使得發布應用到服務器的流程簡單了很多。

在我們創建 Docker 鏡像的過程中,最直接的方法是從包含 Go 的鏡像開始,把源碼 ADD 到里面,編譯,生成鏡像,但是這個過程中有兩個問題:

  • 鏡像通常會比較大,~500MB;
  • 連同源碼也一起打包到鏡像內部。

網上有很多文章提到的了如何為 Go 應用建立一個非常緊湊的 Docker 鏡像。受到 Nick Gauthier 和 Adriaan 的想法的啟發,我們開發了 slimage,一個命令行工具,使得這個過程更加簡單易用。使用 slimage,我們支持編譯帶或不帶 Cgo 支持的 Go 應用,最終的鏡像大小為 ~25MB (包含一些命令行調試工具)。

slimage 是一個 Bash 應用。我們同時還提供一個 windows cmd 的版本。

用法

linux/mingw 或者 mac上:

$ git clone https://github.com/hesion3d/slimage.git
$ cd slimage
slimage$ export GOPATH=pwd/demo
slimage$ ./run.sh -f demo-config.sh -l min -n hello-slimage
Prepare for building...
Building src...
Analyzing ELF files...
Building...
Sending build context to Docker daemon 8.127 MB
Step 1 : FROM scratch
 ---> 
Step 2 : COPY . /
 ---> Using cache
 ---> 8c143d09beb3
Step 3 : ENTRYPOINT /opt/bin/hello-slimage --server_ip=0.0.0.0
 ---> Using cache
 ---> 422adde5b9af
Successfully built 422adde5b9af

slimage$ docker run --rm -p 8080:80 hello-slimage</code></pre>

windows上:

run.bat -f demo-config.sh -l min -n hello-slimage

大致原理

網上很多文章提到在 Docker 容器中使用 Docker 生成鏡像,我們沒有這么做。slimage 在 Docker 容器中編譯 Go 源碼。然后:

  1. 找到要打包的可執行文件 (ELF 格式) 的依賴關系
  2. 整理好完整的 linux 路徑,將所有需要的文件,包括被依賴的庫放到對應目錄
  3. 把該目錄從容器中拷貝出來
  4. 在容器外把剛剛整理好的文件樹生成 Docker 鏡像

參考

  1. Building Minimum Docker Containers for Go Applications .
  2. Create the Smallest Possible Docker Container .

 

來自:https://github.com/hesion3d/slimage/blob/master/README.zh_CN.md

 

 本文由用戶 BarP81 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!