slimage:為 Go 語言應用創建最小化的 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 源碼。然后:
- 找到要打包的可執行文件 (ELF 格式) 的依賴關系
- 整理好完整的 linux 路徑,將所有需要的文件,包括被依賴的庫放到對應目錄
- 把該目錄從容器中拷貝出來
- 在容器外把剛剛整理好的文件樹生成 Docker 鏡像
參考
- Building Minimum Docker Containers for Go Applications .
- Create the Smallest Possible Docker Container .
來自:https://github.com/hesion3d/slimage/blob/master/README.zh_CN.md
本文由用戶 BarP81 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!