57 lines
2.2 KiB
Docker
57 lines
2.2 KiB
Docker
# builder 阶段:npm 依赖缓存跨构建持久化
|
||
FROM node:20-alpine AS builder
|
||
WORKDIR /app
|
||
COPY package*.json ./
|
||
RUN apk add --no-cache python3 make g++
|
||
RUN --mount=type=cache,target=/root/.npm,id=issue-npm \
|
||
npm ci
|
||
COPY . .
|
||
RUN npm run build
|
||
# 编译 Worker 入口脚本 + monitor 模块 + db 模块为 JS(使用专用 tsconfig 解析 @/ 路径别名)
|
||
RUN npx tsc -p tsconfig.worker.json && npx tsc-alias -p tsconfig.worker.json
|
||
|
||
# runner 阶段:使用 Debian(glibc)以支持 better-sqlite3 等 glibc 原生模块
|
||
FROM node:20-slim AS runner
|
||
WORKDIR /app
|
||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
fonts-noto-cjk \
|
||
# Chromium 依赖库(Puppeteer 生成图表截图需要)—— 每次新增依赖需确认镜像内存在
|
||
libglib2.0-0 \
|
||
libnss3 \
|
||
libnspr4 \
|
||
libatk1.0-0 \
|
||
libatk-bridge2.0-0 \
|
||
libcups2 \
|
||
libdrm2 \
|
||
libdbus-1-3 \
|
||
libxkbcommon0 \
|
||
libxcomposite1 \
|
||
libxdamage1 \
|
||
libxfixes3 \
|
||
libxrandr2 \
|
||
libgbm1 \
|
||
libasound2 \
|
||
libpango-1.0-0 \
|
||
libcairo2 \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
COPY --from=builder /app/package.json /app/package-lock.json ./
|
||
COPY --from=builder /app/.next/standalone ./
|
||
RUN npm install --omit=dev && \
|
||
npm rebuild better-sqlite3 && \
|
||
rm -rf node_modules/@img/sharp-linuxmusl-x64 node_modules/@img/sharp-libvips-linuxmusl-x64 \
|
||
node_modules/@next/swc-linux-x64-musl
|
||
COPY --from=builder /app/.next/static ./.next/static
|
||
COPY --from=builder /app/public ./public
|
||
# 复制编译后的 Worker 文件(非 .ts 源码)
|
||
COPY --from=builder /app/.next/standalone/scripts/monitor-worker.js /app/scripts/
|
||
COPY --from=builder /app/.next/standalone/src/lib/monitor /app/src/lib/monitor
|
||
COPY --from=builder /app/.next/standalone/src/lib/db.js /app/src/lib/
|
||
COPY --from=builder /app/.next/standalone/src/lib/db-schema.js /app/src/lib/
|
||
COPY --from=builder /app/.next/standalone/src/lib/assets-client.js /app/src/lib/
|
||
RUN mkdir -p /app/data /app/uploads /app/reports
|
||
EXPOSE 3000
|
||
# 使用 entrypoint.sh 同时启动 Next.js Server 和 Monitor Worker
|
||
COPY entrypoint.sh /app/entrypoint.sh
|
||
RUN chmod +x /app/entrypoint.sh
|
||
CMD ["/app/entrypoint.sh"]
|