最簡單的 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
6. 微信交流群
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 最簡單的Go Dockerfile編寫姿勢,沒有之一!GoDocker
- 最簡單的 K8S 部署檔案編寫姿勢,沒有之一!K8S
- 最簡單的移動端適配方案(rem+vw)--沒有之一REM
- 最簡單的服務響應時長優化方法,沒有之一優化
- 用Java編寫一個最簡單的桌面程式Java
- 用 Go 編寫一個簡單的 WebSocket 推送服務GoWeb
- 編寫DockerFileDocker
- Dockerfile編寫Docker
- 一個簡單的BypassUAC編寫
- 最簡單的dockerfile使用教程 - 建立一個支援SSL的Nginx映象DockerNginx
- 如何編寫DockerfileDocker
- 史上最強程式碼自測方法,沒有之一!
- 當Bert遇上Keras:這可能是Bert最簡單的開啟姿勢Keras
- 史上最漂亮的許願牆,許願網,沒有之一
- 編寫一個簡單的JavaScript模板引擎JavaScript
- 編寫一個簡單的智慧合約
- 編寫一個簡單的babel外掛Babel
- 學習編寫DockerfileDocker
- 如何編寫優雅的DockerfileDocker
- 手把手教你編寫最簡單的效能指令碼指令碼
- 編寫易維護跨端元件的正確姿勢跨端元件
- LeetCode 上最難的連結串列演算法題,沒有之一!LeetCode演算法
- Go的優雅終止姿勢Go
- Docker實戰-編寫DockerfileDocker
- Docker | dockerfile 檔案編寫Docker
- 可能是世界上最簡單的用 Go 來寫 WebAssembly 的教程GoWeb
- 刷LeetCode的簡易姿勢LeetCode
- Docker的基本使用及DockerFile的編寫Docker
- 教你如何編寫第一個簡單的爬蟲爬蟲
- Python編寫一個簡單計算器Python
- 在node中使用ts的compilerOptions.paths的簡單姿勢Compile
- 高效編寫Dockerfile的幾條準則Docker
- 3分鐘短文:可能是Laravel模板最直白的用法了,沒有之一Laravel
- SourceGenerator 使用姿勢(1):生成代理類,實現簡單的AOP
- 編寫簡單的Java程式碼:HelloWoridJava
- 使用 Vala 編寫一個簡單的文字識別程式
- 前端工程化(1):VSCode中編寫Vue程式碼的最佳姿勢前端VSCodeVue
- 寫給 Android 開發者的 Gradle 系列(一)基本姿勢AndroidGradle