# 一条命令启动整套服务:MySQL 数据库 + FastAPI 应用 # # 构建并启动:docker compose up -d --build # 初始化建表:docker compose exec app python init_db.py # 导入测试数据:docker compose exec app python init_test_data.py # 查看日志:docker compose logs -f app # 停止:docker compose down (加 -v 会连数据库数据一起删除) # services: # ---------- MySQL 数据库 ---------- db: image: mysql:8.0 container_name: sms_mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: "123456" MYSQL_DATABASE: "claude_sms_test" # 容器首次启动时自动创建该库 TZ: Asia/Shanghai command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci ports: - "3307:3306" # 如需用本机客户端连接,可保留;不需要可删掉 volumes: - mysql_data:/var/lib/mysql # 数据持久化,容器删除数据也不丢 healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD"] interval: 5s timeout: 5s retries: 20 # ---------- FastAPI 应用 ---------- app: build: . container_name: sms_app restart: unless-stopped depends_on: db: condition: service_healthy # 等 MySQL 健康后再启动,避免连接失败 environment: # 关键:容器之间用「服务名 db」通信,而不是 localhost DB_HOST: db DB_PORT: "3306" DB_USER: root DB_PASSWORD: "123456" DB_NAME: claude_sms_test SQL_ECHO: "false" # 生产环境关闭 SQL 日志 ports: - "8002:8002" # 如需热更新调试,可挂载源码并开启 reload: # volumes: ["./:/app"] # command: ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8002", "--reload"] volumes: mysql_data: