增加docker文件

This commit is contained in:
zhl
2026-09-21 20:43:32 +08:00
parent ef88fbdbe9
commit a061f1ab8b
5 changed files with 100 additions and 6 deletions
+20
View File
@@ -0,0 +1,20 @@
__pycache__
*.pyc
*.pyo
*.pyd
node_modules/
.codebuddy/
generated-images/
artifacts/
.venv/
venv/
env/
.git/
.gitignore
.DS_Store
*.log
tests/
+18
View File
@@ -0,0 +1,18 @@
# 基础镜像
FROM python:3.12-slim
# 设置工作目录
WORKDIR /app
# 先复制 requirements.txt 并安装依赖,利用 Docker 镜像缓存(使用清华镜像源加速)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制整个项目代码到容器
COPY . .
# 暴露端口
EXPOSE 8005
# 启动命令:运行 main.py 中的 FastAPI 应用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8005"]
+5 -2
View File
@@ -1,14 +1,17 @@
# database.py
# 本文件负责配置数据库连接、创建引擎、会话工厂,并提供依赖注入函数
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.decl_api import declarative_base
# 1. 配置 MySQL 数据库连接 URL
# 格式:mysql+pymysql://用户名:密码@主机:端口/数据库名?编码
# 请将下面的 'root', '123456', 'localhost', '3306', 'test_db' 替换为你自己的实际信息
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:123456@localhost:3306/student_management_system"
# 优先读取环境变量 DATABASE_URL,便于 Docker / 生产环境覆盖;
# 本地直接 python main.py 跑时,使用下面的本地默认值。
DEFAULT_DATABASE_URL = "mysql+pymysql://root:123456@localhost:3306/student_management_system"
SQLALCHEMY_DATABASE_URL = os.getenv("DATABASE_URL", DEFAULT_DATABASE_URL)
# 2. 创建数据库引擎
engine = create_engine(
+43
View File
@@ -0,0 +1,43 @@
# docker-compose.yml
# 一条命令启动整个系统:docker compose up -d --build
# 停止:docker compose down
# 删除数据:docker compose down -v
services:
mysql:
image: mysql:8.0
container_name: sms-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: student_management_system
TZ: Asia/Shanghai
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
# 注意:不把 3306 映射到宿主机,避免和本机已装的 MySQL 冲突
# (应用容器通过 Docker 内部网络 "mysql" 主机名访问,不需要映射)
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p123456"]
interval: 5s
timeout: 5s
retries: 20
app:
build: .
container_name: sms-app
restart: unless-stopped
depends_on:
mysql:
condition: service_healthy
environment:
# 在容器里 mysql 这个 hostname 解析到 mysql 服务
DATABASE_URL: mysql+pymysql://root:123456@mysql:3306/student_management_system?charset=utf8mb4
ports:
- "8005:8005"
volumes:
mysql_data:
+13 -3
View File
@@ -1,5 +1,6 @@
# main0814.py
# 项目入口文件:创建 FastAPI 应用、注册路由、创建数据库表
from contextlib import asynccontextmanager
from fastapi import FastAPI
from pathlib import Path
from fastapi.responses import FileResponse, JSONResponse
@@ -11,11 +12,20 @@ from starlette.middleware.cors import CORSMiddleware
from api import student_api, advisor_api, employment_api, score_api, class_api, teacher_api
from init_db import init_all, drop_tables
# 1. 应用生命周期:启动时自动建表(幂等,已有表不会重建)
@asynccontextmanager
async def lifespan(app: FastAPI):
init_all(False, False) # 不重置、不灌种子,仅保证表存在
yield
# 2. 创建 FastAPI 实例
app = FastAPI(
title="FastAPI + SQLAlchemy 分层架构(MySQL)",
description="用户管理示例,演示分层架构和 MySQL 集成",
version="1.0.0"
version="1.0.0",
lifespan=lifespan,
)
# 3. 添加跨域中间件(允许前端跨域请求)
@@ -94,7 +104,7 @@ if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app", # 指定应用位置(模块名:应用变量名)
host="0.0.0.0", # 监听所有网络接口
port=8004, # 端口
host="127.0.0.1", # 只监听本机,终端里的链接可直接点击打开
port=8005, # 端口(与 Dockerfile / docker-compose 一致)
reload=True # 开发模式,代码变动自动重启
)