2025-12-20 15:20:55 +08:00
|
|
|
|
FROM golang:1.25-alpine AS builder
|
2025-12-02 16:52:24 +08:00
|
|
|
|
ENV CGO_ENABLED=0
|
2025-12-11 15:04:13 +08:00
|
|
|
|
ENV GO111MODULE=on
|
2025-12-20 15:35:22 +08:00
|
|
|
|
# 使用多个国内 Go 代理镜像源,提高可用性和速度
|
|
|
|
|
|
# 顺序:goproxy.cn(七牛云) -> goproxy.io -> mirrors.aliyun.com(阿里云) -> direct(直连)
|
|
|
|
|
|
ENV GOPROXY=https://goproxy.cn,https://goproxy.io,https://mirrors.aliyun.com/goproxy/,direct
|
2025-12-20 15:20:55 +08:00
|
|
|
|
# 确保 PATH 包含 Go bin 目录,以便 protoc 能找到插件
|
|
|
|
|
|
ENV PATH=$PATH:/go/bin
|
2025-12-20 15:33:27 +08:00
|
|
|
|
# 配置 Alpine 国内镜像源(阿里云)
|
|
|
|
|
|
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
|
2025-12-20 15:20:37 +08:00
|
|
|
|
# 安装构建所需的工具:git、protoc、make
|
|
|
|
|
|
RUN apk add --no-cache git protobuf make
|
2025-12-11 15:04:13 +08:00
|
|
|
|
WORKDIR /app
|
2025-12-20 14:32:11 +08:00
|
|
|
|
|
|
|
|
|
|
# 复制 go.work 文件(用于工作区配置,必须在项目根目录)
|
|
|
|
|
|
COPY go.work go.work.sum* ./
|
|
|
|
|
|
|
2025-12-20 15:20:55 +08:00
|
|
|
|
# 复制所有模块的 go.mod 文件(先复制所有依赖文件以利用 Docker 缓存)
|
|
|
|
|
|
# 需要先复制所有 go.mod,因为 go.work 引用了它们
|
2025-12-11 15:04:13 +08:00
|
|
|
|
COPY server/go.mod server/go.sum ./server/
|
2025-12-20 15:20:55 +08:00
|
|
|
|
COPY grpc/user/userv1/go.mod grpc/user/userv1/go.sum* ./grpc/user/userv1/
|
2025-12-20 14:32:11 +08:00
|
|
|
|
|
2025-12-20 15:20:55 +08:00
|
|
|
|
# 在项目根目录执行 go mod download(go.work 会自动处理所有模块)
|
2025-12-20 14:32:11 +08:00
|
|
|
|
WORKDIR /app
|
2025-12-20 15:20:55 +08:00
|
|
|
|
RUN go work sync
|
2025-12-20 14:32:11 +08:00
|
|
|
|
|
2025-12-20 15:32:40 +08:00
|
|
|
|
# 安装 protoc 插件(使用单个 RUN 命令减少层数)
|
2025-12-20 15:20:55 +08:00
|
|
|
|
# 使用临时工作目录安装插件,避免影响项目目录
|
|
|
|
|
|
WORKDIR /tmp
|
2025-12-20 15:20:37 +08:00
|
|
|
|
RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@latest && \
|
|
|
|
|
|
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest && \
|
|
|
|
|
|
go install github.com/envoyproxy/protoc-gen-validate@latest && \
|
|
|
|
|
|
go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http@latest && \
|
|
|
|
|
|
go install github.com/go-kratos/kratos/cmd/protoc-gen-go-errors@latest
|
|
|
|
|
|
|
|
|
|
|
|
# 复制 grpc 目录(包括 proto 文件和 Makefile)
|
2025-12-20 15:20:55 +08:00
|
|
|
|
WORKDIR /app
|
2025-12-20 15:20:37 +08:00
|
|
|
|
COPY grpc/ ./grpc/
|
|
|
|
|
|
|
2025-12-20 15:21:24 +08:00
|
|
|
|
# 在容器内生成 proto 文件(只生成需要的文件,排除 HTTP 相关)
|
2025-12-20 15:20:37 +08:00
|
|
|
|
WORKDIR /app/grpc
|
2025-12-20 15:21:24 +08:00
|
|
|
|
# 只生成 go、grpc、validate 和 errors 文件,不生成 http 文件(避免依赖问题)
|
|
|
|
|
|
RUN protoc --proto_path=./ \
|
|
|
|
|
|
--proto_path=./third_party \
|
|
|
|
|
|
--go_out=paths=source_relative:./ \
|
|
|
|
|
|
--go-grpc_out=paths=source_relative:./ \
|
|
|
|
|
|
--validate_out=paths=source_relative,lang=go:./ \
|
|
|
|
|
|
--go-errors_out=paths=source_relative:./ \
|
|
|
|
|
|
$(find . -path "./third_party" -prune -o -type f -name "*.proto" -print)
|
2025-12-20 15:20:37 +08:00
|
|
|
|
|
2025-12-20 15:20:55 +08:00
|
|
|
|
# 生成 proto 后,更新依赖(proto 生成的文件可能需要额外的依赖)
|
|
|
|
|
|
WORKDIR /app/grpc/user/userv1
|
|
|
|
|
|
RUN go mod tidy
|
|
|
|
|
|
|
2025-12-20 15:20:37 +08:00
|
|
|
|
# 复制 server 源代码
|
2025-12-20 14:32:11 +08:00
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
COPY server/ ./server/
|
|
|
|
|
|
|
|
|
|
|
|
# 构建应用(在项目根目录,go.work 会自动生效)
|
2025-12-20 15:09:18 +08:00
|
|
|
|
# 使用 -ldflags 减小二进制文件大小,移除调试信息
|
2025-12-20 14:32:11 +08:00
|
|
|
|
WORKDIR /app/server
|
2025-12-20 15:22:25 +08:00
|
|
|
|
RUN go build -ldflags="-w -s" -trimpath -o /out/server ./cmd/server/main.go && \
|
|
|
|
|
|
chmod +x /out/server
|
2025-12-02 15:48:17 +08:00
|
|
|
|
|
2025-12-20 16:04:53 +08:00
|
|
|
|
# 使用带Go环境的镜像,支持容器启动时编译
|
|
|
|
|
|
FROM golang:1.25-alpine
|
|
|
|
|
|
ENV CGO_ENABLED=0
|
|
|
|
|
|
ENV GO111MODULE=on
|
|
|
|
|
|
ENV GOPROXY=https://goproxy.cn,https://goproxy.io,https://mirrors.aliyun.com/goproxy/,direct
|
2025-12-20 15:33:27 +08:00
|
|
|
|
# 配置 Alpine 国内镜像源(阿里云)
|
|
|
|
|
|
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
|
2025-12-20 16:04:53 +08:00
|
|
|
|
# 安装运行时必需的包:时区、CA 证书和 git
|
|
|
|
|
|
RUN apk add --no-cache ca-certificates tzdata git && \
|
2025-12-20 15:32:40 +08:00
|
|
|
|
mkdir -p /app/storage/export /app/log
|
2025-12-11 15:04:13 +08:00
|
|
|
|
WORKDIR /app
|
2025-12-20 16:04:53 +08:00
|
|
|
|
|
|
|
|
|
|
# 复制 go.work 和依赖文件
|
|
|
|
|
|
COPY go.work go.work.sum* ./
|
|
|
|
|
|
COPY server/go.mod server/go.sum ./server/
|
|
|
|
|
|
COPY grpc/user/userv1/go.mod grpc/user/userv1/go.sum* ./grpc/user/userv1/
|
|
|
|
|
|
|
|
|
|
|
|
# 下载依赖(利用缓存)
|
|
|
|
|
|
RUN go work sync
|
|
|
|
|
|
|
|
|
|
|
|
# 复制 grpc 生成的代码
|
|
|
|
|
|
COPY --from=builder /app/grpc/ ./grpc/
|
|
|
|
|
|
|
|
|
|
|
|
# 复制 server 源代码
|
|
|
|
|
|
COPY server/ ./server/
|
|
|
|
|
|
|
2025-12-20 15:52:04 +08:00
|
|
|
|
# 复制前端静态文件
|
|
|
|
|
|
COPY web/ ./web/
|
2025-12-20 16:04:53 +08:00
|
|
|
|
|
2025-12-02 15:48:17 +08:00
|
|
|
|
EXPOSE 8077
|
2025-12-20 16:16:49 +08:00
|
|
|
|
# 容器启动时编译并运行(在 go.work 所在目录执行)
|
|
|
|
|
|
ENTRYPOINT ["sh", "-c", "cd /app && go build -ldflags='-w -s' -trimpath -o /app/server-bin ./server/cmd/server/main.go && exec /app/server-bin"]
|