From 43083de9657ed22e85a078615656d384e2c93f31 Mon Sep 17 00:00:00 2001 From: herui02 Date: Fri, 28 Feb 2025 22:26:51 +0800 Subject: [PATCH 1/3] Add Docker support with development and production configurations --- README.md | 58 +++++++++++++++++++++++++++++++++++++ docker/.dockerignore | 58 +++++++++++++++++++++++++++++++++++++ docker/Dockerfile.dev | 29 +++++++++++++++++++ docker/Dockerfile.prod | 60 +++++++++++++++++++++++++++++++++++++++ docker/docker-compose.yml | 16 +++++++++++ 5 files changed, 221 insertions(+) create mode 100644 docker/.dockerignore create mode 100644 docker/Dockerfile.dev create mode 100644 docker/Dockerfile.prod create mode 100644 docker/docker-compose.yml diff --git a/README.md b/README.md index d3d6482..43a035c 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,64 @@ 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 用户名 +- 开发环境支持热重载,代码修改后会自动更新 +- 生产环境使用多阶段构建,优化了镜像大小和安全性 +- 所有环境都使用非 root 用户运行,提高安全性 + ## 使用指南 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..1e1575f --- /dev/null +++ b/docker/Dockerfile.dev @@ -0,0 +1,29 @@ +FROM node:20-alpine + +WORKDIR /app + +# Install pnpm +RUN npm install -g pnpm + +# Add a non-root user +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nextjs -u 1001 + +# 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 + +# Switch to non-root user +USER nextjs + +# Copy source code +COPY --chown=nextjs:nodejs . . + +# 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 From 7a1a60cebc8b3e699fa4660571c5814eda6e3368 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 1 Mar 2025 04:45:15 -0800 Subject: [PATCH 2/3] Simplify Dockerfile.dev user configuration --- docker/Dockerfile.dev | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 1e1575f..fe39c62 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -5,10 +5,6 @@ WORKDIR /app # Install pnpm RUN npm install -g pnpm -# Add a non-root user -RUN addgroup -g 1001 -S nodejs && \ - adduser -S nextjs -u 1001 - # Copy package files COPY package.json pnpm-lock.yaml ./ @@ -16,11 +12,8 @@ COPY package.json pnpm-lock.yaml ./ RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile -# Switch to non-root user -USER nextjs - # Copy source code -COPY --chown=nextjs:nodejs . . +COPY . . # Expose port EXPOSE 3000 From 784bfe900b56559a7ee77632c87da0e5db70f572 Mon Sep 17 00:00:00 2001 From: henryalps Date: Sat, 1 Mar 2025 05:01:51 -0800 Subject: [PATCH 3/3] Remove redundant Docker and environment notes from README --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 43a035c..c62a9e0 100644 --- a/README.md +++ b/README.md @@ -101,9 +101,6 @@ docker run -p 3000:3000 [your-dockerhub-username]/neurapress:latest 注意: - 使用 Docker Hub 时,请将 `[your-dockerhub-username]` 替换为你的 Docker Hub 用户名 -- 开发环境支持热重载,代码修改后会自动更新 -- 生产环境使用多阶段构建,优化了镜像大小和安全性 -- 所有环境都使用非 root 用户运行,提高安全性 ## 使用指南