最簡單的 Go Dockerfile 編寫姿勢,沒有之一!
1. Dockerfile 一些額外注意點
選擇最簡單的映象
比如 alpine,整個映象 5M 左右
設定映象時區
RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai
2. 多階段構建
第一階段構建出可執行檔案,確保構建過程獨立於宿主機
第二階段將第一階段的輸出作為輸入,構建出最終的極簡映象
3. 完整 Dockerfile 編寫過程
首先安裝 goctl 工具
GO111MODULE=on GOPROXY= go get -u github.com/tal-tech/go-zero/tools/goctl
在 greet 專案下建立一個 hello 服務
goctl api new hello
檔案結構如下:
greet
├── go.mod
├── go.sum
└── service
└── hello
├── 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
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/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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989477/viewspace-2755264/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 最簡單的Go Dockerfile編寫姿勢,沒有之一!GoDocker
- 最簡單的 K8S 部署檔案編寫姿勢,沒有之一!K8S
- 最簡單的服務響應時長優化方法,沒有之一優化
- 最簡單的移動端適配方案(rem+vw)--沒有之一REM
- 編寫最簡單的核心:HelloWorld
- 用Java編寫一個最簡單的桌面程式Java
- 用 Go 編寫一個簡單的 WebSocket 推送服務GoWeb
- Dockerfile編寫Docker
- 編寫DockerFileDocker
- 寫一個 iOS 複雜表單的正確姿勢iOS
- 史上最強程式碼自測方法,沒有之一!
- 最簡單的dockerfile使用教程 - 建立一個支援SSL的Nginx映象DockerNginx
- 如何編寫DockerfileDocker
- 如何編寫最佳的DockerfileDocker
- javascript編寫一個簡單的編譯器JavaScript編譯
- 編寫易維護跨端元件的正確姿勢跨端元件
- 學習編寫DockerfileDocker
- 編寫一個非常簡單的 JavaScript 編輯器JavaScript
- Go的優雅終止姿勢Go
- 如何編寫優雅的DockerfileDocker
- 編寫一個簡單的智慧合約
- 編寫一個簡單的babel外掛Babel
- 編寫一個簡單的JavaScript模板引擎JavaScript
- 手把手教你編寫最簡單的效能指令碼指令碼
- Docker | dockerfile 檔案編寫Docker
- Docker實戰-編寫DockerfileDocker
- 可能是世界上最簡單的用 Go 來寫 WebAssembly 的教程GoWeb
- Docker的基本使用及DockerFile的編寫Docker
- LeetCode 上最難的連結串列演算法題,沒有之一!LeetCode演算法
- 3分鐘短文:可能是Laravel模板最直白的用法了,沒有之一Laravel
- SourceGenerator 使用姿勢(1):生成代理類,實現簡單的AOP
- 教你如何編寫第一個簡單的爬蟲爬蟲
- 高效編寫Dockerfile的幾條準則Docker
- 在node中使用ts的compilerOptions.paths的簡單姿勢Compile
- 寫給 Android 開發者的 Gradle 系列(一)基本姿勢AndroidGradle
- 我是見鬼了麼?這是史上最邪惡的指令碼!沒有之一!指令碼
- 用BCB寫一個最簡單的多執行緒 (轉)執行緒
- 刷LeetCode的簡易姿勢LeetCode