打造最小 Go Docker Image

簡短幾步驟輕鬆打造最小 Docker Image

ta-ching chen

1 minute read

 文章目錄

Hello World 

先寫個簡單不斷印出 Hello World 的小程式

// main.go
package main

import (
    "fmt"
    "time"
)

func main() {
    for {
        fmt.Println("Hello World!")
        time.Sleep(1 * time.Second)
    }
}

容器化 

交叉編譯 

若是 native build 的話 Go 預設會打開 CGO_ENABLED 這個參數,主要是讓 Go 執行檔能夠直接連結到系統上的函式庫(libraries),而不必另外打包進執行檔。但由於 scratch 這個特別的 Docker image 本身空空如也,連基本的函式庫也沒有。因此我們需要關閉 CGO_ENABLED 讓編譯器能夠將程式所需的函式庫一起打包進執行檔內。

如果是 cross compilation 的話,記得要加入 GOOSGOARCH 這兩個參數。

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main

構建映像檔 

我們只需要三行便完成所需的 Dockerfile

FROM scratch
ADD main /
CMD ["/main"]

構建映像檔

$ docker build -t minimal_go_docker_img .
$ docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
minimal_go_docker_img             1.0                 8f836c8b219a        17 minutes ago      1.638 MB

嘗試執行 

$ docker run --rm minimal_go_docker_img

加入 SSL 憑證 

如果程式有需要存取 HTTPS 相關服務,記得要放入 CA 憑證。

通常你可以在任意 Linux distribution 的 /etc/ssl/certs/ 底下找到 ca-certificates.crt

FROM scratch
ADD ca-certificates.crt /etc/ssl/certs/
ADD main /
CMD ["/main"]

進階閱讀 

參考連結 

comments powered by Disqus