diff --git a/Dockerfile b/Dockerfile index 9d4958d..07bd165 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,8 +2,8 @@ FROM golang:1.21-alpine AS builder ENV CGO_ENABLED=0 ENV GO111MODULE=on ENV GOPROXY=https://goproxy.cn,direct -# 只安装构建所需的工具 -RUN apk add --no-cache git +# 安装构建所需的工具:git、protoc、make +RUN apk add --no-cache git protobuf make WORKDIR /app # 复制 go.work 文件(用于工作区配置,必须在项目根目录) @@ -20,11 +20,24 @@ COPY grpc/user/userv1/go.mod grpc/user/userv1/go.sum ./grpc/user/userv1/ WORKDIR /app/grpc/user/userv1 RUN go mod download -# 复制所有源代码(包括生成的 proto 文件) -# 注意:必须在 go.work 所在的目录下构建,才能正确识别工作区 +# 安装 protoc 插件(需要在有 go.mod 的环境中安装) +WORKDIR /app +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) +COPY grpc/ ./grpc/ + +# 在容器内生成 proto 文件 +WORKDIR /app/grpc +RUN make generate + +# 复制 server 源代码 WORKDIR /app COPY server/ ./server/ -COPY grpc/user/userv1/ ./grpc/user/userv1/ # 构建应用(在项目根目录,go.work 会自动生效) # 使用 -ldflags 减小二进制文件大小,移除调试信息 diff --git a/scripts/deploy_docker.sh b/scripts/deploy_docker.sh index e556181..37e0099 100755 --- a/scripts/deploy_docker.sh +++ b/scripts/deploy_docker.sh @@ -18,18 +18,19 @@ if [ ! -f "$ROOT_DIR/grpc/user/userv1/go.mod" ]; then exit 1 fi -# 检查 proto 文件是否已生成(至少检查一个关键文件) -if [ ! -f "$ROOT_DIR/grpc/user/userv1/user.pb.go" ]; then - echo "proto 文件未生成,正在自动生成..." >&2 - cd "$ROOT_DIR/grpc" && make generate - cd "$ROOT_DIR" - if [ ! -f "$ROOT_DIR/grpc/user/userv1/user.pb.go" ]; then - echo "错误: proto 文件生成失败" >&2 - exit 1 - fi - echo "proto 文件生成成功" >&2 +# 检查 grpc 目录和 Makefile 是否存在 +if [ ! -d "$ROOT_DIR/grpc" ]; then + echo "错误: grpc 目录不存在" >&2 + exit 1 fi +if [ ! -f "$ROOT_DIR/grpc/Makefile" ]; then + echo "错误: grpc/Makefile 文件不存在" >&2 + exit 1 +fi + +# proto 文件将在容器内自动生成,无需在构建前生成 + # 每次重新构建镜像 echo "开始构建 Docker 镜像..." DOCKER_BUILDKIT=1 docker build \