1. 程式人生 > >使用docker scratch 空映象構建golang docker 服務

使用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 函式拉起來。
服務小,做升級,降級,版本管理的優勢超級大。
非常好的。