56 lines
1.9 KiB
YAML
56 lines
1.9 KiB
YAML
# 一条命令启动整套服务: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:
|