From b0dc17115902cb260018f24cc2668fcc7556550a Mon Sep 17 00:00:00 2001 From: wanwu Date: Mon, 6 Oct 2025 23:13:06 +0800 Subject: [PATCH] chore(docker): move Dockerfile and docker-compose.yml from wwjcloud-nest to root docker/ --- docker/Dockerfile | 44 +++++++++++++++++++++++++++ docker/docker-compose.yml | 64 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 docker/Dockerfile create mode 100644 docker/docker-compose.yml diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..d3d936c --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,44 @@ +# ======================================== +# NestJS Backend Dockerfile +# ======================================== +FROM node:20-alpine AS builder + +WORKDIR /app + +# 复制package文件 +COPY package*.json ./ + +# 安装所有依赖(包括 devDependencies,用于构建) +RUN npm ci && npm cache clean --force + +# 复制源码 +COPY . . + +# 构建应用 +RUN npm run build + +# 删除 devDependencies,只保留生产依赖 +RUN npm prune --production + +# ======================================== +# Production Stage +# ======================================== +FROM node:20-alpine + +WORKDIR /app + +# 复制依赖和构建产物 +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/package*.json ./ + +# 暴露端口 +EXPOSE 3000 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=3s --start-period=40s \ + CMD node -e "require('http').get('http://localhost:3000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" + +# 启动应用 +CMD ["node", "dist/main"] + diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..3464b3a --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,64 @@ +services: + mysql: + image: mysql:8.0 + container_name: wwjcloud-mysql + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: wwjcloud + MYSQL_CHARACTER_SET_SERVER: utf8mb4 + MYSQL_COLLATION_SERVER: utf8mb4_general_ci + ports: + - "3306:3306" + volumes: + - mysql_data:/var/lib/mysql + # 先不挂载schema.sql,让应用程序自动创建表 + command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci + networks: + - wwjcloud-network + + redis: + image: redis:7-alpine + container_name: wwjcloud-redis + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis_data:/data + command: redis-server --appendonly yes --requirepass "" + networks: + - wwjcloud-network + + # WWJCloud 应用程序容器 (可选,用于生产部署) + app: + build: + context: . + dockerfile: Dockerfile + container_name: wwjcloud-app + restart: unless-stopped + ports: + - "3001:3001" + environment: + - NODE_ENV=production + - DB_HOST=mysql + - DB_PORT=3306 + - DB_USERNAME=root + - DB_PASSWORD=root + - DB_DATABASE=wwjcloud + - REDIS_HOST=redis + - REDIS_PORT=6379 + depends_on: + - mysql + - redis + networks: + - wwjcloud-network + profiles: + - production # 使用 profile 来控制是否启动应用容器 + +volumes: + mysql_data: + redis_data: + +networks: + wwjcloud-network: + driver: bridge \ No newline at end of file