diff --git a/README.md b/README.md index d3d6482..c62a9e0 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,61 @@ pnpm build pnpm start ``` +### 使用 Docker + +我们提供了两种 Docker 环境配置:开发环境和生产环境。所有 Docker 相关文件都位于 `docker` 目录下。 + +#### 开发环境 + +使用 Docker Compose 启动开发环境(支持热重载): + +```bash +# 启动开发环境 +docker compose -f docker/docker-compose.yml up + +# 在后台运行 +docker compose -f docker/docker-compose.yml up -d + +# 停止服务 +docker compose -f docker/docker-compose.yml down +``` + +#### 生产环境 + +```bash +# 构建生产镜像 +docker build -t neurapress:prod -f docker/Dockerfile.prod . + +# 运行生产容器 +docker run -p 3000:3000 neurapress:prod +``` + +#### 发布到 Docker Hub + +```bash +# 登录到 Docker Hub +docker login + +# 构建并标记镜像 +docker build -t [your-dockerhub-username]/neurapress:latest -f docker/Dockerfile.prod . + +# 推送到 Docker Hub +docker push [your-dockerhub-username]/neurapress:latest +``` + +#### 从 Docker Hub 拉取和运行 + +```bash +# 拉取镜像 +docker pull [your-dockerhub-username]/neurapress:latest + +# 运行容器 +docker run -p 3000:3000 [your-dockerhub-username]/neurapress:latest +``` + +注意: +- 使用 Docker Hub 时,请将 `[your-dockerhub-username]` 替换为你的 Docker Hub 用户名 + ## 使用指南 1. **编辑内容** diff --git a/docker/.dockerignore b/docker/.dockerignore new file mode 100644 index 0000000..38a1a93 --- /dev/null +++ b/docker/.dockerignore @@ -0,0 +1,58 @@ +# Dependencies +node_modules +.pnpm-store +.npm +.yarn + +# Next.js build output +.next +out +build + +# Testing +coverage +.nyc_output + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# Local env files +.env*.local +.env +.env.development +.env.test +.env.production + +# Version control +.git +.gitignore +.gitattributes + +# IDE +.idea +.vscode +*.swp +*.swo +*.swn +.DS_Store + +# Docker +docker/ +Dockerfile* +docker-compose* +.dockerignore + +# Cursor +.cursor + +# Misc +*.log +.cache +.eslintcache +.stylelintcache +*.bak +*.tmp +*~ \ No newline at end of file diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev new file mode 100644 index 0000000..fe39c62 --- /dev/null +++ b/docker/Dockerfile.dev @@ -0,0 +1,22 @@ +FROM node:20-alpine + +WORKDIR /app + +# Install pnpm +RUN npm install -g pnpm + +# Copy package files +COPY package.json pnpm-lock.yaml ./ + +# Install dependencies with cache optimization +RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ + pnpm install --frozen-lockfile + +# Copy source code +COPY . . + +# Expose port +EXPOSE 3000 + +# Start development server +CMD ["pnpm", "dev"] \ No newline at end of file diff --git a/docker/Dockerfile.prod b/docker/Dockerfile.prod new file mode 100644 index 0000000..4aa54ee --- /dev/null +++ b/docker/Dockerfile.prod @@ -0,0 +1,60 @@ +# Build stage +FROM node:20-alpine AS builder + +# Add a non-root user +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nextjs -u 1001 + +WORKDIR /app + +# Install pnpm +RUN npm install -g pnpm + +# Copy package files +COPY package.json pnpm-lock.yaml ./ + +# Install dependencies with cache optimization +RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ + pnpm install --frozen-lockfile + +# Copy source code +COPY . . + +# Build application +RUN pnpm build + +# Production stage +FROM node:20-alpine AS runner + +# Add a non-root user +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nextjs -u 1001 + +WORKDIR /app + +# Install pnpm +RUN npm install -g pnpm + +# Set production environment +ENV NODE_ENV=production +ENV PORT=3000 + +# Copy necessary files from builder +COPY --from=builder --chown=nextjs:nodejs /app/package.json . +COPY --from=builder --chown=nextjs:nodejs /app/pnpm-lock.yaml . +COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next +COPY --from=builder --chown=nextjs:nodejs /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/next.config.js . + +# Install production dependencies only +RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ + pnpm install --prod --frozen-lockfile + +# Switch to non-root user +USER nextjs + +# Expose port +EXPOSE 3000 + +# Start the application +CMD ["pnpm", "start"] \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..28962e4 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.8' + +services: + app: + build: + context: .. + dockerfile: docker/Dockerfile.dev + ports: + - "3000:3000" + volumes: + - ..:/app + - /app/node_modules + - /app/.next + environment: + - NODE_ENV=development + command: pnpm dev \ No newline at end of file