Dockerfile 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. # syntax=docker/dockerfile:1
  2. FROM --platform=$BUILDPLATFORM node:22-slim AS build-base
  3. ENV PNPM_HOME=/pnpm
  4. ENV PATH="$PNPM_HOME:$PATH"
  5. RUN corepack enable
  6. WORKDIR /app
  7. FROM build-base AS deps
  8. COPY package.json pnpm-lock.yaml ./
  9. RUN --mount=type=cache,target=/root/.local/share/pnpm/store pnpm install --frozen-lockfile
  10. FROM deps AS build
  11. COPY . .
  12. # 接收构建参数
  13. ARG APP_VERSION=dev
  14. # 设置为环境变量供 Next.js 使用
  15. ENV NEXT_TELEMETRY_DISABLED=1
  16. ENV NEXT_PUBLIC_APP_VERSION=$APP_VERSION
  17. RUN pnpm run build
  18. FROM node:22-slim AS runner
  19. ENV NODE_ENV=production
  20. ENV PORT=3000
  21. ENV HOST=0.0.0.0
  22. WORKDIR /app
  23. # 安装 PostgreSQL 18 客户端工具(用于数据库备份/恢复功能)
  24. # 需要使用官方 PostgreSQL APT 仓库以获取最新版本
  25. RUN apt-get update && \
  26. apt-get install -y gnupg curl ca-certificates && \
  27. curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql-archive-keyring.gpg && \
  28. echo "deb [signed-by=/usr/share/keyrings/postgresql-archive-keyring.gpg] http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \
  29. apt-get update && \
  30. apt-get install -y postgresql-client-18 && \
  31. rm -rf /var/lib/apt/lists/*
  32. COPY --from=build --chown=node:node /app/public ./public
  33. COPY --from=build --chown=node:node /app/drizzle ./drizzle
  34. COPY --from=build --chown=node:node /app/.next/standalone ./
  35. COPY --from=build --chown=node:node /app/.next/static ./.next/static
  36. USER node
  37. EXPOSE 3000
  38. CMD ["node", "server.js"]