diff --git a/.dockerignore b/.dockerignore index 32b8f9a..8382135 100644 --- a/.dockerignore +++ b/.dockerignore @@ -6,3 +6,7 @@ server/config.yaml server/config.test.yaml server/config.prod.yaml scripts/*.tar +# 注意:不要忽略以下文件,它们对构建很重要 +# !go.work +# !go.work.sum +# !grpc/user/userv1/ diff --git a/Dockerfile b/Dockerfile index c2973cb..1579fdb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,10 +4,29 @@ ENV GO111MODULE=on ENV GOPROXY=https://goproxy.cn,direct RUN apk add --no-cache git tzdata WORKDIR /app + +# 复制 go.work 文件(用于工作区配置,必须在项目根目录) +COPY go.work go.work.sum* ./ + +# 复制 server 模块的依赖文件(先复制依赖文件以利用 Docker 缓存) COPY server/go.mod server/go.sum ./server/ WORKDIR /app/server RUN go mod download -COPY server/ ./ + +# 复制 grpc/user/userv1 模块的依赖文件 +WORKDIR /app +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 所在的目录下构建,才能正确识别工作区 +WORKDIR /app +COPY server/ ./server/ +COPY grpc/user/userv1/ ./grpc/user/userv1/ + +# 构建应用(在项目根目录,go.work 会自动生效) +WORKDIR /app/server RUN go build -o /out/server ./cmd/server/main.go FROM alpine:3.19 diff --git a/scripts/deploy_docker.sh b/scripts/deploy_docker.sh index 623922e..701e338 100755 --- a/scripts/deploy_docker.sh +++ b/scripts/deploy_docker.sh @@ -7,10 +7,33 @@ TAG="$ENV_NAME" PORT="${PORT:-8077}" cd "$ROOT_DIR" +# 检查必要的文件是否存在 +if [ ! -f "$ROOT_DIR/go.work" ]; then + echo "错误: go.work 文件不存在,请确保已正确配置工作区" >&2 + exit 1 +fi + +if [ ! -f "$ROOT_DIR/grpc/user/userv1/go.mod" ]; then + echo "错误: grpc/user/userv1/go.mod 文件不存在" >&2 + exit 1 +fi + +# 检查 proto 文件是否已生成(至少检查一个关键文件) +if [ ! -f "$ROOT_DIR/grpc/user/userv1/user.pb.go" ]; then + echo "警告: proto 文件未生成,构建可能会失败" >&2 + echo "提示: 运行 'cd grpc && make generate' 生成 proto 文件" >&2 + read -p "是否继续构建? (y/N) " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi +fi + # 如果镜像存在,则直接使用;否则构建 if docker image inspect "$IMAGE:$TAG" >/dev/null 2>&1; then echo "镜像 $IMAGE:$TAG 已存在,跳过构建。" else + echo "开始构建 Docker 镜像..." DOCKER_BUILDKIT=1 docker build \ --build-arg BUILDKIT_INLINE_CACHE=1 \ --build-arg GOPROXY="${GOPROXY:-https://goproxy.cn,direct}" \