MarketingSystemDataExportTool/Dockerfile

97 lines
3.8 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

FROM golang:1.25-alpine AS builder
ENV CGO_ENABLED=0
ENV GO111MODULE=on
# 使用多个国内 Go 代理镜像源,提高可用性和速度
# 顺序goproxy.cn(七牛云) -> goproxy.io -> mirrors.aliyun.com(阿里云) -> direct(直连)
ENV GOPROXY=https://goproxy.cn,https://goproxy.io,https://mirrors.aliyun.com/goproxy/,direct
# 确保 PATH 包含 Go bin 目录,以便 protoc 能找到插件
ENV PATH=$PATH:/go/bin
# 配置 Alpine 国内镜像源(阿里云)
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 安装构建所需的工具git、protoc、make
RUN apk add --no-cache git protobuf make
WORKDIR /app
# 复制 go.work 文件(用于工作区配置,必须在项目根目录)
COPY go.work go.work.sum* ./
# 复制所有模块的 go.mod 文件(先复制所有依赖文件以利用 Docker 缓存)
# 需要先复制所有 go.mod因为 go.work 引用了它们
COPY server/go.mod server/go.sum ./server/
COPY grpc/user/userv1/go.mod grpc/user/userv1/go.sum* ./grpc/user/userv1/
# 在项目根目录执行 go mod downloadgo.work 会自动处理所有模块)
WORKDIR /app
RUN go work sync
# 安装 protoc 插件(使用单个 RUN 命令减少层数)
# 使用临时工作目录安装插件,避免影响项目目录
WORKDIR /tmp
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
WORKDIR /app
COPY grpc/ ./grpc/
# 在容器内生成 proto 文件(只生成需要的文件,排除 HTTP 相关)
WORKDIR /app/grpc
# 只生成 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)
# 生成 proto 后更新依赖proto 生成的文件可能需要额外的依赖)
WORKDIR /app/grpc/user/userv1
RUN go mod tidy
# 复制 server 源代码
WORKDIR /app
COPY server/ ./server/
# 构建应用在项目根目录go.work 会自动生效)
# 使用 -ldflags 减小二进制文件大小,移除调试信息
WORKDIR /app/server
RUN go build -ldflags="-w -s" -trimpath -o /out/server ./cmd/server/main.go && \
chmod +x /out/server
# 使用带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
# 配置 Alpine 国内镜像源(阿里云)
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 安装运行时必需的包时区、CA 证书和 git
RUN apk add --no-cache ca-certificates tzdata git && \
mkdir -p /app/storage/export /app/log
WORKDIR /app
# 复制 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/
# 复制前端静态文件
COPY web/ ./web/
EXPOSE 8077
# 容器启动时编译并运行(在 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"]