我平時用的 golang 項目結構

寫了好多年的 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"]
相關文章
相關標籤/搜索