寫了好多年的 golang,逐漸造成了本身的一套習慣。項目裏包含哪些文件,該放的東西放哪,基本都有了套路。固然這也只是針對我本身而已。git
. ├── ... // docker 鏡像構建須要忽略的文件 ├── ├── .dockerignore // docker 鏡像構建須要忽略的文件 ├── Dockerfile // docker 構建文件 ├── ├── .git ├── .gitignore // git 忽略的文件 ├── ├── .gitlab-ci.yml // gitlab ci 配置。若是使用的是 github,能夠使用 github action ├── .golangci.yml // golangci-lint 使用的針對項目的配置 ├── ├── Makefile // make 配置文件 ├── ├── dumb-init_1.2.1_amd64 // 構建 docker 鏡像時須要 ├── ├── go.mod // go module 依賴配置 ├── go.sum ├── ├── README.md // 項目 README 文件 ├── CHANGELOG.md // 項目的 CHANGELOG └── version
Dockerfile 又一個比較好的最佳實踐。可供參考:github
# 設置編譯使用的 Go SDK 版本。 ARG GO_VERSION=1.16 # 第一步:編譯程序。 FROM golang:${GO_VERSION} AS builder # 編譯工做目錄。 WORKDIR /src # 設置 Go Modules 代理。 ENV GOPROXY=https://goproxy.cn # 下載項目所需的第三方依賴庫。 COPY ./go.mod ./go.sum ./ RUN go mod download # 編譯輔助工具。 RUN go build -o ./gops github.com/google/gops # 拷貝項目代碼並編譯。 COPY ./ ./ RUN go build -o ./xxx -ldflags "-X main.version=`cat ./version`" github.com/alfred-zhong/xxx # 第二步:設置運行容器。 FROM centos:7 AS final # 設置本地時間。 RUN mv /etc/localtime /etc/localtime.bak && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 程序運行目錄。 RUN mkdir /app WORKDIR /app # 設置運行所需環境變量。 ENV GOPS=on # 將編程後生成的可執行文件及相關依賴拷貝進來。 COPY --from=builder /src/xxx ./ COPY --from=builder /src/dumb-init_1.2.1_amd64 ./ COPY --from=builder /src/gops ./ # 設置執行文件權限。 RUN chmod u+x ./dumb-init_1.2.1_amd64 # 設置暴露端口(須要大於 1024)。 EXPOSE 28002 # 運行入口。 CMD ["./dumb-init_1.2.1_amd64", "--", "./xxx"]