44# ========= 前端构建阶段 =========
55FROM node:20-alpine AS frontend-builder
66
7- # 安装必要工具(包括 zip)
8- RUN apk add --no-cache zip
9-
107# 使用 corepack 预装 pnpm
118RUN corepack enable && corepack prepare pnpm@latest --activate
129
13- WORKDIR /app
10+ # 设置 pnpm 环境变量,避免交互式提示
11+ ENV PNPM_HOME="/pnpm"
12+ ENV PATH="$PNPM_HOME:$PATH"
13+ ENV CI=true
1414
15- # 缓存依赖层
16- COPY package.json pnpm-lock.yaml ./
17- RUN pnpm install --frozen-lockfile --prod=false
15+ WORKDIR /app
1816
1917# 复制前端源代码
20- COPY . .
21-
22- # 运行构建脚本,生成静态文件到 dist/
23- RUN pnpm build
18+ COPY web/ ./web/
2419
25- # 📦 压缩前端文件为 dist.zip(Go embed 需要)
26- RUN cd dist && zip -r ../dist.zip . && cd ..
27-
28- # 📋 复制 dist.zip 到 cmd/server/ 目录(Go embed 需要)
29- RUN cp dist.zip cmd/server/
30-
31- # 清理 dev 依赖,减少后续镜像体积
32- RUN pnpm prune --prod
20+ # 进入 web 目录,清理并安装依赖,然后构建
21+ RUN cd web && \
22+ rm -rf node_modules && \
23+ pnpm install --frozen-lockfile --prod=false --ignore-scripts && \
24+ pnpm build && \
25+ pnpm prune --prod
3326
3427# ========= Go 构建阶段 =========
3528FROM golang:1.23-alpine AS backend-builder
@@ -50,8 +43,12 @@ ENV GOTIMEOUT=600s
5043# 增加网络重试和下载超时
5144RUN go mod download -x
5245
53- # 复制剩余代码(包括先前前端生成的 dist)
54- COPY --from=frontend-builder /app .
46+ # 复制 Go 后端代码
47+ COPY cmd/ ./cmd/
48+ COPY internal/ ./internal/
49+
50+ # 复制前端构建产物到 cmd/server/dist 目录
51+ COPY --from=frontend-builder /app/cmd/server/dist ./cmd/server/dist
5552
5653# 启用 CGO 和设置编译标记以支持 musl
5754ENV CGO_ENABLED=1
@@ -67,10 +64,8 @@ LABEL org.opencontainers.image.version=$VERSION
6764ENV APP_VERSION=$VERSION
6865WORKDIR /app
6966
70- # 拷贝可执行文件、静态资源、public 目录
67+ # 只需要拷贝可执行文件(静态资源已通过 embed 嵌入)
7168COPY --from=backend-builder /app/nodepassdash ./
72- COPY --from=backend-builder /app/dist ./dist
73- COPY --from=backend-builder /app/public ./public
7469
7570# 默认端口
7671EXPOSE 3000
0 commit comments