# 全栈 Dockerfile (多阶段构建) FROM node:22-alpine AS frontend-builder # 设置前端工作目录 WORKDIR /frontend # 复制 package.json 和 package-lock.json COPY web/package.json web/package-lock.json* ./ # 安装前端依赖 RUN npm ci # 复制前端源代码并构建 COPY web/ . RUN npm run build # 后端构建阶段 FROM python:3.12-slim AS backend-builder # 设置后端工作目录 WORKDIR /backend # 安装系统依赖 RUN apt-get update && apt-get install -y \ gcc \ g++ \ curl \ && rm -rf /var/lib/apt/lists/* # 复制依赖文件 COPY requirements.txt . # 安装 Python 依赖 清华园镜像源 RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 复制后端项目代码 COPY src/ ./src/ COPY static/ ./static/ # 最终生产阶段 - 使用 Nginx 和 Python FROM python:3.12-slim # 安装系统依赖 RUN apt-get update && apt-get install -y \ gcc \ g++ \ curl \ nginx \ && rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /app # 复制依赖文件并在最终阶段重新安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 从后端构建阶段复制代码 COPY --from=backend-builder /backend/src ./src COPY --from=backend-builder /backend/static ./static # 修改 Nginx 配置以适配单容器部署,并屏蔽健康检查日志 COPY deploy/nginx.conf /tmp/nginx.conf RUN sed 's/backend:8002/127.0.0.1:8002/g' /tmp/nginx.conf > /etc/nginx/sites-available/default \ && sed -i '/^}$/i\ \ # 屏蔽健康检查日志\ location = /api/init-status {\ access_log off;\ proxy_pass http://127.0.0.1:8002;\ proxy_set_header Host \$host;\ proxy_set_header X-Real-IP \$remote_addr;\ proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;\ proxy_set_header X-Forwarded-Proto \$scheme;\ }\ \ # 屏蔽其他健康检查相关API的日志\ location ~ ^/api/(state|health|ping) {\ access_log off;\ proxy_pass http://127.0.0.1:8002;\ proxy_set_header Host \$host;\ proxy_set_header X-Real-IP \$remote_addr;\ proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;\ proxy_set_header X-Forwarded-Proto \$scheme;\ }' /etc/nginx/sites-available/default RUN ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/ # 从前端构建阶段复制构建产物 COPY --from=frontend-builder /frontend/dist /usr/share/nginx/html # 创建必要的目录 RUN mkdir -p /app/assets/saves /app/logs /app/assets # 复制资产文件 COPY assets/ /app/assets/ # 暴露端口 EXPOSE 80 8002 # 创建启动脚本 - 同时启动 Nginx 和 Python 后端,屏蔽健康检查日志 RUN echo '#!/bin/bash\n\ set -e\n\ \n\ # 启动后端 Python 应用作为后台进程,禁用访问日志\n\ echo "Starting backend server..."\n\ uvicorn src.server.main:app --host 0.0.0.0 --port 8002 &\n\ BACKEND_PID=$!\n\ \n\ # 等待后端服务启动\n\ sleep 5\n\ \n\ # 启动 Nginx\n\ echo "Starting nginx..."\n\ nginx -g "daemon off;" &\n\ NGINX_PID=$!\n\ \n\ # 等待所有进程\n\ wait $BACKEND_PID $NGINX_PID' > /start.sh RUN chmod +x /start.sh CMD ["/start.sh"] # docker build -f deploy/Dockerfile.all -t cultivation-world-simulator:20260206 . # docker tag cultivation-world-simulator:20260206 registry.cn-chengdu.aliyuncs.com/yexuejc/cultivation-world-simulator:20260206 # docker push registry.cn-chengdu.aliyuncs.com/yexuejc/cultivation-world-simulator:20260206