Files
cultivation-world-simulator/deploy/Dockerfile.all
2026-02-06 23:48:22 +08:00

125 lines
3.3 KiB
Docker

# 全栈 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 .