使用docker scratch 空映象構建golang docker 服務
1,關於scratch
特別有意思的一個映象,是在使用 jaeger 的時候發現的,
發現 jaeger 的映象特別小,很好奇,於是研究了下。
scratch 是一非常特別的映象,這個映象很有意思的是他是一個空映象。
也就是說大小几乎是 0 。
但是不能單獨跑起來,只能做基礎映象,然後把main 程式放上去。
說白就是是一個執行緒了,這樣有個非常好的優勢,映象小,沒有依賴。
地址:
/scratch/”>https://hub.docker.com//scratch/
開始還以為是 alpine 比較小呢,看了這個是更小了。
小意味著效率高呢,部署升級的效率超級高。
2,使用golang構建scratch映象
服務端程式碼:webServer.go
package main
import (
"io"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world!")
}
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8000", nil)
}
build 編譯main 函式
docker run --rm -it -v ${PWD}:/go golang:stretch env GOOS= linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags -s -a -installsuffix cgo webServer.go
在當前資料夾要有 webServer.go 檔案。
–rm 表示構建完成刪除映象。
-it 表示互動模式
-v ${PWD}:/go 載入卷
剩下是設定 linux 變數,-ldflags -s 使用裁剪模式。
docker file :
FROM scratch
ADD webServer /webServer
EXPOSE 8000
CMD ["/webServer"]
構建docker映象:
docker build -t stretch-demo:latest .
啟動:
docker run -itd -p 8000:8000 stretch-demo:latest
測試:
curl localhost:8000
Hello world!
3,映象大小
stretch-demo latest db7fd3718d92 4.163 MB
映象大小 4.1 mb
4.0M Feb 1 13:15 webServer
如果要不加入 -ldflags -s 就大一點了
5.9M Feb 1 13:14 webServer
一個是使用docker images 看的大小,一個使用的是 ls -lh 看的大小。
差不多都是 4 mb 。超級小呢。比alpine 還小。
4,總結
scratch 是一個空映象,使用docker 把main 函式拉起來。
服務小,做升級,降級,版本管理的優勢超級大。
非常好的。