Dockerfile 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # syntax=docker/dockerfile:1
  2. FROM --platform=$BUILDPLATFORM oven/bun:1.3.2-slim AS build-base
  3. WORKDIR /app
  4. FROM build-base AS deps
  5. COPY package.json bun.lock ./
  6. RUN bun install --frozen-lockfile
  7. FROM deps AS build
  8. COPY . .
  9. # 接收构建参数
  10. ARG APP_VERSION=dev
  11. # 设置为环境变量供 Next.js 使用
  12. ENV NEXT_TELEMETRY_DISABLED=1
  13. ENV NEXT_PUBLIC_APP_VERSION=$APP_VERSION
  14. # 构建时需要的环境变量 (避免数据库初始化错误)
  15. # 这些是占位符,实际运行时会被真实值覆盖
  16. ENV DSN="postgres://placeholder:placeholder@localhost:5432/placeholder"
  17. ENV REDIS_URL="redis://localhost:6379"
  18. # 标记为 CI 环境,跳过 instrumentation.ts 中的数据库连接
  19. ENV CI=true
  20. RUN bun run build
  21. FROM node:22-slim AS runner
  22. ENV NODE_ENV=production
  23. ENV PORT=3000
  24. ENV HOST=0.0.0.0
  25. WORKDIR /app
  26. # 安装 PostgreSQL 18 客户端工具(用于数据库备份/恢复功能)和 curl(用于健康检查)
  27. # 需要使用官方 PostgreSQL APT 仓库以获取最新版本
  28. RUN apt-get update && \
  29. apt-get install -y gnupg curl ca-certificates && \
  30. curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql-archive-keyring.gpg && \
  31. 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 && \
  32. apt-get update && \
  33. apt-get install -y postgresql-client-18 && \
  34. rm -rf /var/lib/apt/lists/*
  35. COPY --from=build --chown=node:node /app/public ./public
  36. COPY --from=build --chown=node:node /app/drizzle ./drizzle
  37. COPY --from=build --chown=node:node /app/messages ./messages
  38. COPY --from=build --chown=node:node /app/.next/standalone ./
  39. # Server Actions live inside .next/server; copy it or Next.js cannot resolve action IDs.
  40. COPY --from=build --chown=node:node /app/.next/server ./.next/server
  41. COPY --from=build --chown=node:node /app/.next/static ./.next/static
  42. USER node
  43. EXPOSE 3000
  44. CMD ["node", "server.js"]