alexcdev1 6 months ago
parent
commit
54ac709b10
11 changed files with 191 additions and 2 deletions
  1. 3 0
      .dockerignore
  2. 2 2
      .env.local
  3. 69 0
      Dockerfile
  4. 18 0
      Dockerfile.dev
  5. 19 0
      Dockerfile.prod
  6. 28 0
      docker-compose.dev.yml
  7. 22 0
      docker-compose.prod.yml
  8. 21 0
      docker-compose.yml
  9. 3 0
      next.config.mjs
  10. 4 0
      package.json
  11. 2 0
      src/app/lib/dbConnect.js

+ 3 - 0
.dockerignore

@@ -0,0 +1,3 @@
+node_modules
+.next
+.git

+ 2 - 2
.env.local

@@ -1,4 +1,4 @@
 # MONGODB_URI=mongodb+srv://admin:password123@cluster0.mongodb.net/mydatabase?retryWrites=true&w=majority
 # MONGODB_URI=mongodb://localhost:27017/mydatabase
-MONGODB_URI=mongodb+srv://alexcdev:MM2wUnaykoiK904j@cluster0.snuq8.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0
-MONGODB_DB_NAME=mydatabase
+# MONGODB_URI=mongodb+srv://alexcdev:MM2wUnaykoiK904j@cluster0.snuq8.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0
+# MONGODB_DB_NAME=mydatabase

+ 69 - 0
Dockerfile

@@ -0,0 +1,69 @@
+# Install dependencies only when needed
+FROM node:alpine AS deps
+# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
+RUN apk add --no-cache libc6-compat
+WORKDIR /app
+
+# Install dependencies based on the preferred package manager
+COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
+RUN \
+  if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
+  elif [ -f package-lock.json ]; then npm ci; \
+  elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \
+  else echo "Lockfile not found." && exit 1; \
+  fi
+
+# Rebuild the source code only when needed
+FROM node:alpine AS builder
+WORKDIR /app
+COPY --from=deps /app/node_modules ./node_modules
+COPY . .
+
+# Next.js collects completely anonymous telemetry data about general usage.
+# Learn more here: https://nextjs.org/telemetry
+# Uncomment the following line in case you want to disable telemetry during the build.
+# ENV NEXT_TELEMETRY_DISABLED 1
+
+RUN yarn build
+
+# If using npm comment out above and use below instead
+# RUN npm run build
+
+# Production image, copy all the files and run next
+FROM node:alpine AS runner
+WORKDIR /app
+
+ENV NODE_ENV production
+# Uncomment the following line in case you want to disable telemetry during runtime.
+# ENV NEXT_TELEMETRY_DISABLED 1
+
+RUN addgroup --system --gid 1001 nodejs
+RUN adduser --system --uid 1001 nextjs
+
+# You only need to copy next.config.js if you are NOT using the default configuration
+# COPY --from=builder /app/next.config.js ./
+COPY --from=builder /app/public ./public
+COPY --from=builder /app/package.json ./package.json
+
+# Automatically leverage output traces to reduce image size 
+# https://nextjs.org/docs/advanced-features/output-file-tracing
+COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
+COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
+
+USER nextjs
+
+EXPOSE 3000
+
+ENV PORT 3000
+
+# Add MongoDB support if needed
+RUN apk add --no-cache mongodb-tools
+
+# Add health check
+HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
+  CMD node -e "require('http').get('http://localhost:3000', (r) => {if (r.statusCode !== 200) throw new Error()})"
+
+# Set MongoDB URI (adjust as needed)
+ENV MONGODB_URI mongodb://mongodb:27017/mydatabase
+
+CMD ["node", "server.js"]

+ 18 - 0
Dockerfile.dev

@@ -0,0 +1,18 @@
+FROM node:alpine
+
+WORKDIR /app
+
+# 复制 package.json 和 yarn.lock
+COPY package.json yarn.lock ./
+
+# 安装依赖
+RUN yarn install
+
+# 复制源代码
+COPY . .
+
+# 暴露端口
+EXPOSE 3000
+
+# 使用开发模式启动应用
+CMD ["yarn", "dev"]

+ 19 - 0
Dockerfile.prod

@@ -0,0 +1,19 @@
+# 构建阶段
+FROM node:14 AS builder
+WORKDIR /app
+COPY package*.json ./
+RUN npm install
+COPY . .
+RUN npm run build
+
+# 生产阶段
+FROM node:14-alpine
+WORKDIR /app
+COPY --from=builder /app/next.config.js ./
+COPY --from=builder /app/public ./public
+COPY --from=builder /app/.next ./.next
+COPY --from=builder /app/node_modules ./node_modules
+COPY --from=builder /app/package.json ./package.json
+
+EXPOSE 3000
+CMD ["npm", "start"]

+ 28 - 0
docker-compose.dev.yml

@@ -0,0 +1,28 @@
+version: '3'
+
+services:
+  nextjs:
+    build:
+      context: .
+      dockerfile: Dockerfile.dev  # 使用专门为开发环境创建的 Dockerfile
+    ports:
+      - "3000:3000"
+    environment:
+      - MONGODB_URI=mongodb://mongodb:27017/mydatabase
+      - NODE_ENV=development
+    volumes:
+      - .:/app  # 挂载当前目录到容器的 /app 目录
+      - /app/node_modules  # 排除 node_modules 目录
+    command: yarn dev  # 使用开发模式启动 Next.js
+    depends_on:
+      - mongodb
+
+  mongodb:
+    image: mongo
+    ports:
+      - "27017:27017"  # 暴露 MongoDB 端口到主机,方便直接连接
+    volumes:
+      - mongodb_data:/data/db
+
+volumes:
+  mongodb_data:

+ 22 - 0
docker-compose.prod.yml

@@ -0,0 +1,22 @@
+version: '3'
+
+services:
+  nextjs:
+    build:
+      context: .
+      dockerfile: Dockerfile.prod
+    ports:
+      - "3000:3000"
+    environment:
+      - NODE_ENV=production
+      - MONGODB_URI=mongodb://mongodb:27017/mydatabase
+    depends_on:
+      - mongodb
+
+  mongodb:
+    image: mongo
+    volumes:
+      - mongodb_data:/data/db
+
+volumes:
+  mongodb_data:

+ 21 - 0
docker-compose.yml

@@ -0,0 +1,21 @@
+version: '3'
+
+services:
+  nextjs:
+    build:
+      context: .
+      dockerfile: Dockerfile
+    ports:
+      - "3000:3000"
+    environment:
+      - MONGODB_URI=mongodb://mongodb:27018/mydatabase
+    depends_on:
+      - mongodb
+
+  mongodb:
+    image: mongo
+    volumes:
+      - mongodb_data:/data/db
+
+volumes:
+  mongodb_data:

+ 3 - 0
next.config.mjs

@@ -16,6 +16,9 @@ const nextConfig = {
       },
     ],
   },
+  env: {
+    MONGODB_URI: process.env.MONGODB_URI,
+  },
 };
 
 export default nextConfig;

+ 4 - 0
package.json

@@ -6,6 +6,10 @@
     "dev": "next dev",
     "build": "next build",
     "start": "next start",
+    "docker:dev": "docker-compose -f docker-compose.dev.yml up --build",
+    "docker:dev:rebuild": "docker-compose -f docker-compose.dev.yml down --rmi all --volumes && docker-compose -f docker-compose.dev.yml up --build",
+    "docker:build": "docker-compose build",
+    "docker:start": "docker-compose up -d",
     "lint": "next lint"
   },
   "dependencies": {

+ 2 - 0
src/app/lib/dbConnect.js

@@ -3,6 +3,8 @@ import mongoose from "mongoose";
 const MONGODB_URI = process.env.MONGODB_URI;
 const DB_NAME = process.env.MONGODB_DB_NAME || "mydatabase";
 
+console.log("MONGODB_URI 555", MONGODB_URI);
+
 if (!MONGODB_URI) {
   throw new Error(
     "Please define the MONGODB_URI environment variable inside .env.local"