gongxiangp2/Dockerfile

89 lines
2.8 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 基础镜像(使用 Alpine,手动处理 OpenSSL 兼容性)
ARG BASE_IMAGE=node:18-alpine
FROM ${BASE_IMAGE} AS base
# 安装依赖阶段
FROM base AS deps
RUN apk add --no-cache libc6-compat python3 make g++ cairo-dev jpeg-dev pango-dev giflib-dev
WORKDIR /app
# 复制 package.json(利用 Docker 层缓存)
COPY package.json package-lock.json* ./
# 安装依赖(使用淘宝镜像加速)
RUN echo "安装依赖..." && \
npm config set registry https://registry.npmmirror.com && \
npm install --prefer-offline --no-audit --no-fund --legacy-peer-deps && \
echo "依赖安装完成($(du -sh /app/node_modules | cut -f1))"
# 构建阶段
FROM base AS builder
# 安装构建依赖
RUN apk add --no-cache libc6-compat python3 make g++ cairo-dev jpeg-dev pango-dev giflib-dev ffmpeg openssl
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# 生成 Prisma Client(跳过构建时的数据库连接检查)
RUN echo "生成 Prisma Client..." && \
npx prisma generate && \
echo "Prisma Client 生成完成"
# 设置环境变量
ENV NEXT_TELEMETRY_DISABLED 1
# 构建应用
RUN npm run build
# 清理 standalone 目录中不需要的文件(减少 1GB+ 体积)
RUN echo "清理 standalone 目录..." && \
rm -rf .next/standalone/uploads && \
rm -rf .next/standalone/.build-cache && \
rm -rf .next/standalone/.docker-cache && \
rm -rf .next/standalone/.git && \
rm -rf .next/standalone/__tests__ && \
rm -rf .next/standalone/docs && \
rm -rf .next/standalone/backups && \
rm -rf .next/standalone/.kiro && \
rm -rf .next/standalone/scripts && \
echo "清理完成"
# 生产运行阶段
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
RUN apk add --no-cache ffmpeg python3 cairo jpeg pango giflib openssl
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs
# 复制必要文件
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=builder --chown=nextjs:nodejs /app/app ./app
# 只复制运行时必需的 node_modules
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/ag-psd ./node_modules/ag-psd
# 只复制 schema.prisma,不复制 migrations 和 engine-cache(减少 35MB)
COPY --from=builder --chown=nextjs:nodejs /app/prisma/schema.prisma ./prisma/schema.prisma
COPY --from=builder --chown=nextjs:nodejs /app/lib ./lib
# 创建必要目录并设置权限
RUN mkdir -p /app/public /app/uploads && \
chown -R nextjs:nodejs /app/public /app/uploads && \
chmod -R 777 /app/uploads
USER nextjs
EXPOSE 3000
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
CMD ["node", "server.js"]