最簡單的Go Dockerfile編寫姿勢,沒有之一!


1. Dockerfile一些額外注意點

  • 選擇最簡單的鏡像

    比如alpine,整個鏡像5M左右

  • 設置鏡像時區

    RUN apk add --no-cache tzdata
    ENV TZ Asia/Shanghai
    

2. 多階段構建

  • 第一階段構建否則構建出可執行文件,確保構建過程獨立於宿主機
  • 第二階段將第一階段的輸出作為輸入,構建出最終的極簡鏡像

3. 完整Dockerfile編寫過程

  • 首先安裝 goctl 工具

    GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/go-zero/tools/goctl

  • greet 項目下創建一個 hello 服務

    goctl api new hello

    文件結構如下:

    greet
    ├── go.mod
    ├── go.sum
    └── service
        └── hello
            ├── Dockerfile
            ├── etc
            │   └── hello-api.yaml
            ├── hello.api
            ├── hello.go
            └── internal
                ├── config
                │   └── config.go
                ├── handler
                │   ├── hellohandler.go
                │   └── routes.go
                ├── logic
                │   └── hellologic.go
                ├── svc
                │   └── servicecontext.go
                └── types
                    └── types.go
    
  • hello 目錄下一鍵生成 Dockerfile

    goctl docker -go greet.go

    Dockerfile 內容如下:

    FROM golang:alpine AS builder
    
    LABEL stage=gobuilder
    
    ENV CGO_ENABLED 0
    ENV GOOS linux
    ENV GOPROXY https://goproxy.cn,direct
    
    WORKDIR /build/zero
    
    ADD go.mod .
    ADD go.sum .
    RUN go mod download
    COPY . .
    COPY service/hello/etc /app/etc
    RUN go build -ldflags="-s -w" -o /app/hello service/hello/hello.go
    
    
    FROM alpine
    
    RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata
    ENV TZ Asia/Shanghai
    
    WORKDIR /app
    COPY --from=builder /app/hello /app/hello
    COPY --from=builder /app/etc /app/etc
    
    CMD ["./hello", "-f", "etc/hello-api.yaml"]
    
  • greet 目錄下 build 鏡像

    docker build -t hello:v1 -f service/hello/Dockerfile .

  • 查看鏡像

    hello v1 5455f2eaea6b 7 minutes ago 18.1MB

    可以看出鏡像大小約為18M。

  • 啟動服務

    docker run --rm -it -p 8888:8888 hello:v1

  • 測試服務

    $ curl -i http://localhost:8888/from/you
    HTTP/1.1 200 OK
    Content-Type: application/json
    Date: Thu, 10 Dec 2020 06:03:02 GMT
    Content-Length: 14
    
    {"message":""}
    

4. 總結

goctl 工具極大簡化了 Dockerfile 文件的編寫,提供了開箱即用的最佳實踐,並且支持了模板自定義。

如果覺得工具有幫助,歡迎 star 🤝

5. 項目地址

https://github.com/tal-tech/go-zero

項目地址:
https://github.com/tal-tech/go-zero


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM