# Docker + Prefect 使用说明 当前方案包含两条定时任务: - `08:00` 执行数据统计并写入飞书多维表格 - `09:00` 推送结果到飞书群 调度配置写在 [prefect.yaml](/Users/idss/YXT_Project/gmv-analytics/prefect.yaml) 中。 ## 1. 创建 Docker 镜像 在项目目录执行: ```bash cd /Users/idss/YXT_Project/gmv-analytics docker build -t gmv-analytics-prefect:latest . ``` 镜像内容来自: - [Dockerfile](/Users/idss/YXT_Project/gmv-analytics/Dockerfile) - [docker-entrypoint.sh](/Users/idss/YXT_Project/gmv-analytics/docker-entrypoint.sh) 容器启动后会: - 加载 `.env` - 自动把 `PROJECT_MAPPING_FILE` 修正为容器内的 `/app/店铺映射表.xlsx` - 默认执行: ```bash python prefect_gmv_scheduler.py --serve ``` ## 2. 启动 Docker 容器 ### 方式 A:直接用 `docker run` ```bash docker run -d \ --name gmv-prefect-scheduler \ --env-file /Users/idss/YXT_Project/gmv-analytics/.env \ -e PROJECT_MAPPING_FILE=/app/店铺映射表.xlsx \ gmv-analytics-prefect:latest ``` 停止容器: ```bash docker stop gmv-prefect-scheduler docker rm gmv-prefect-scheduler ``` ### 方式 B:用 `docker compose` 项目里已经有 [docker-compose.yaml](/Users/idss/YXT_Project/gmv-analytics/docker-compose.yaml)。 启动: ```bash cd /Users/idss/YXT_Project/gmv-analytics docker compose up -d --build ``` 停止: ```bash docker compose down ``` ## 3. 注册 Prefect 调度 推荐方式是使用 [prefect.yaml](/Users/idss/YXT_Project/gmv-analytics/prefect.yaml) 注册 deployment: ```bash cd /Users/idss/YXT_Project/gmv-analytics prefect deploy --all ``` 这会向 `.env` 中的 `PREFECT_API_URL` 注册两个 deployment: - `gmv-daily-data-sync-8am` - `gmv-daily-notify-9am` 前提条件: - `.env` 中已经配置好 `PREFECT_API_URL` - Prefect API 服务可访问 - 已经有可用的 work pool 当前 [prefect.yaml](/Users/idss/YXT_Project/gmv-analytics/prefect.yaml) 默认使用: `default-agent-pool` 如果还没有 worker,可以在宿主机启动一个: ```bash prefect worker start --pool default-agent-pool --type process ``` ## 4. 自动执行是怎么发生的 如果你走的是 `prefect deploy --all` 方案: 1. `prefect.yaml` 注册两个 deployment 2. Prefect Server/Cloud 按 cron 触发: - `08:00`:`gmv-daily-data-sync-8am` - `09:00`:`gmv-daily-notify-9am` 3. Prefect worker 拉起执行 4. 代码入口在 [prefect_gmv_scheduler.py](/Users/idss/YXT_Project/gmv-analytics/prefect_gmv_scheduler.py) 如果你走的是容器内 `--serve` 方案: 1. 容器常驻运行 `python prefect_gmv_scheduler.py --serve` 2. 代码里会本地注册并维持两个定时调度 3. 到时间后容器内部直接执行 flow 建议: - 正式环境优先用 `prefect.yaml + prefect deploy --all` - `--serve` 更适合本地或过渡期 ## 5. 单次手动执行 只跑数据同步: ```bash python /Users/idss/YXT_Project/gmv-analytics/prefect_gmv_scheduler.py --mode sync ``` 只跑飞书通知: ```bash python /Users/idss/YXT_Project/gmv-analytics/prefect_gmv_scheduler.py --mode notify ``` 先同步再通知: ```bash python /Users/idss/YXT_Project/gmv-analytics/prefect_gmv_scheduler.py --mode all ``` 如果要在 Docker 里手动执行: ```bash docker run --rm \ --env-file /Users/idss/YXT_Project/gmv-analytics/.env \ -e PROJECT_MAPPING_FILE=/app/店铺映射表.xlsx \ gmv-analytics-prefect:latest \ python prefect_gmv_scheduler.py --mode sync ``` ## 6. Docker 中的日志 现在日志分成两层: ### 6.1 容器标准输出日志 这是你最先看到的日志来源。 如果用 `docker run`: ```bash docker logs -f gmv-prefect-scheduler ``` 如果用 `docker compose`: ```bash cd /Users/idss/YXT_Project/gmv-analytics docker compose logs -f ``` 这些日志包含: - Prefect flow 启动/完成 - 每天数据同步流程 - 飞书接口日志 - 错误堆栈 ### 6.2 容器内本地文件日志 项目已经接了统一日志模块 [logging_config.py](/Users/idss/YXT_Project/gmv-analytics/logging_config.py),所以日志还会写入容器内文件: - 默认目录:`/app/logs` - 默认文件:`/app/logs/gmv_sync.log` 进入容器查看: ```bash docker exec -it gmv-prefect-scheduler sh tail -f /app/logs/gmv_sync.log ``` 如果是 compose: ```bash docker exec -it gmv-prefect-scheduler sh tail -f /app/logs/gmv_sync.log ``` ### 6.3 日志级别 默认是 `INFO`。 如果要看更细的调试日志,在 `.env` 里加: ```bash LOG_LEVEL=DEBUG ``` 可选日志配置还有: ```bash LOG_DIR=/app/logs LOG_FILE_NAME=gmv_sync.log LOG_MAX_BYTES=10485760 LOG_BACKUP_COUNT=7 ``` ## 7. 现在最推荐的执行方式 如果你要的是“长期稳定自动执行”,建议这样: 1. 构建镜像 2. 准备好 `.env` 3. 启动 Prefect API 4. 启动 worker 5. 执行: ```bash cd /Users/idss/YXT_Project/gmv-analytics prefect deploy --all ``` 如果你只是希望一个容器自己在里面定时跑,也可以直接: ```bash docker compose up -d --build ``` 这时它会直接跑 `--serve`,由容器自己维持调度。