11# NodePass WebUI - 整合SSE服务的Docker镜像
22# Next.js应用内置SSE服务,单端口运行
33
4- FROM node:18-alpine AS base
4+ # 添加版本参数
5+ ARG VERSION=1.1.2
56
6- # 安装必要的系统依赖
7- RUN apk add --no-cache \
8- postgresql-client \
9- python3 \
10- make \
11- g++ \
12- && npm install -g pnpm
7+ # 依赖阶段 - 用于缓存依赖
8+ FROM node:18-alpine AS deps
139
14- WORKDIR /app
10+ # 设置pnpm
11+ RUN corepack enable && corepack prepare pnpm@latest --activate
1512
16- # ================================
17- # 依赖安装阶段
18- # ================================
19- FROM base AS deps
13+ WORKDIR /app
2014
21- # 复制依赖配置文件
22- COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
15+ # 只复制package文件
16+ COPY package.json pnpm-lock.yaml ./
2317
2418# 安装依赖
25- RUN pnpm install --frozen-lockfile
26-
27- # ================================
28- # 开发环境 (用于 docker-compose 开发)
29- # ================================
30- FROM base AS development
31-
32- # 复制依赖
33- COPY --from=deps /app/node_modules ./node_modules
34- COPY --from=deps /app/package.json ./package.json
35-
36- # 复制所有源代码
37- COPY . .
19+ RUN apk add --no-cache python3 make g++ && \
20+ pnpm install --frozen-lockfile
3821
39- # 生成 Prisma 客户端
40- RUN pnpm exec prisma generate
41-
42- # 暴露端口 (仅需要3000端口,SSE服务已整合)
43- EXPOSE 3000
44-
45- # 健康检查
46- HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
47- CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1
22+ # 构建阶段
23+ FROM node:18-alpine AS builder
4824
49- # 开发启动脚本
50- CMD ["sh" , "-c" , "\
51- echo '🚀 启动NodePass开发环境 (整合SSE服务)...' && \
52- echo '⏳ 等待数据库连接...' && \
53- while ! pg_isready -h postgres -p 5432 -U ${POSTGRES_USER:-nodepass} -q; do \
54- echo '⏳ 等待PostgreSQL启动...' && sleep 2; \
55- done && \
56- echo '📊 运行数据库迁移...' && \
57- pnpm exec prisma migrate deploy && \
58- echo '🌱 生成Prisma客户端...' && \
59- pnpm exec prisma generate && \
60- echo '🎯 启动整合服务 (Next.js + SSE)...' && \
61- pnpm dev:integrated \
62- " ]
25+ # 设置pnpm
26+ RUN corepack enable && corepack prepare pnpm@latest --activate
6327
64- # ================================
65- # 构建阶段
66- # ================================
67- FROM base AS builder
28+ WORKDIR /app
6829
6930# 复制依赖
7031COPY --from=deps /app/node_modules ./node_modules
7132COPY --from=deps /app/package.json ./package.json
7233
73- # 复制源代码
34+ # 复制源代码并构建
7435COPY . .
36+ RUN pnpm exec prisma generate && pnpm build
7537
76- # 生成 Prisma 客户端
77- RUN pnpm exec prisma generate
38+ # 生产环境
39+ FROM node:18-alpine AS production
7840
79- # 构建应用
80- RUN pnpm build
41+ # 设置版本标签
42+ ARG VERSION
43+ LABEL version=${VERSION}
44+ LABEL org.opencontainers.image.version=${VERSION}
8145
82- # ================================
83- # 生产环境
84- # ================================
85- FROM base AS production
46+ # 设置pnpm(使用corepack而不是npm)
47+ RUN corepack enable && corepack prepare pnpm@latest --activate
8648
87- # 安装生产依赖和必要的CLI工具
88- COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
89- RUN pnpm install --frozen-lockfile --prod && \
90- pnpm add prisma tsx --save-dev
49+ WORKDIR /app
9150
92- # 复制构建产物和必要文件
51+ # 合并所有生产环境的设置
52+ RUN apk add --no-cache postgresql-client && \
53+ addgroup -g 1001 -S nodejs && \
54+ adduser -S nextjs -u 1001
55+
56+ # 只复制生产所需文件
57+ COPY --from=builder /app/package.json /app/pnpm-lock.yaml ./
9358COPY --from=builder /app/.next ./.next
94- COPY --from=builder /app/server.ts ./server.ts
9559COPY --from=builder /app/prisma ./prisma
96- COPY --from=builder /app/lib ./lib
97- COPY --from=builder /app/scripts ./scripts
98- COPY --from=builder /app/app ./app
99- COPY --from=builder /app/components ./components
100- COPY --from=builder /app/styles ./styles
101- COPY --from=builder /app/config ./config
102- COPY --from=builder /app/types ./types
103- COPY --from=builder /app/tsconfig.json ./tsconfig.json
10460COPY --from=builder /app/next.config.js ./next.config.js
61+ COPY --from=builder /app/public ./public
10562
106- # 生成 Prisma 客户端(生产环境)
107- RUN pnpm exec prisma generate
108-
109- # 创建非root用户
110- RUN addgroup -g 1001 -S nodejs && \
111- adduser -S nextjs -u 1001
63+ # 只安装生产依赖并清理
64+ RUN pnpm install --frozen-lockfile --prod && \
65+ pnpm add prisma --save-dev && \
66+ pnpm exec prisma generate && \
67+ pnpm cache clean && \
68+ rm -rf /root/.cache /root/.npm && \
69+ chown -R nextjs:nodejs /app
11270
113- # 设置正确的权限
114- RUN chown -R nextjs:nodejs /app
11571USER nextjs
11672
117- # 暴露端口 (仅需要3000端口,SSE服务已整合)
11873EXPOSE 3000
11974
120- # 健康检查
12175HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
12276 CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1
12377
124- # 生产启动脚本
78+ # 添加版本信息到环境变量
79+ ENV APP_VERSION=${VERSION}
80+
12581CMD ["sh" , "-c" , "\
12682 echo '🚀 启动NodePass生产环境 (整合SSE服务)...' && \
83+ echo '📦 当前版本: '${APP_VERSION} && \
12784 echo '⏳ 等待数据库连接...' && \
12885 while ! pg_isready -h postgres -p 5432 -U ${POSTGRES_USER:-nodepass} -q; do \
12986 echo '⏳ 等待PostgreSQL启动...' && sleep 2; \
13087 done && \
13188 echo '📊 运行数据库迁移...' && \
13289 pnpm exec prisma migrate deploy && \
13390 echo '🎯 启动整合生产服务...' && \
134- pnpm start:integrated \
91+ NODE_ENV=production pnpm start \
13592" ]
0 commit comments