MarketingSystemDataExportTool/Dockerfile

75 lines
3.0 KiB
Docker
Raw 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
ENV GOPROXY=https://goproxy.cn,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
# 使用最小化的 alpine 镜像(包含时区支持,应用需要 loc=Local
FROM alpine:3.19
# 配置 Alpine 国内镜像源(阿里云)
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 安装运行时必需的包:时区和 CA 证书
RUN apk add --no-cache ca-certificates tzdata && \
mkdir -p /app/storage/export /app/log
WORKDIR /app
COPY --from=builder /out/server /app/server
EXPOSE 8077
# 使用 root 用户运行
ENTRYPOINT ["/app/server"]