Files
gmv-analytics/DOCKER_PREFECT_USAGE.md
T

239 lines
5.0 KiB
Markdown
Raw Normal View History

2026-03-24 16:33:14 +08:00
# Docker + Prefect 使用说明
2026-03-13 18:55:33 +08:00
2026-03-24 16:33:14 +08:00
当前方案包含两条定时任务:
- `08:00` 执行数据统计并写入飞书多维表格
- `09:00` 推送结果到飞书群
调度配置写在 [prefect.yaml](/Users/idss/YXT_Project/gmv-analytics/prefect.yaml) 中。
## 1. 创建 Docker 镜像
在项目目录执行:
2026-03-13 18:55:33 +08:00
```bash
cd /Users/idss/YXT_Project/gmv-analytics
docker build -t gmv-analytics-prefect:latest .
```
2026-03-24 16:33:14 +08:00
镜像内容来自:
2026-03-13 18:55:33 +08:00
2026-03-24 16:33:14 +08:00
- [Dockerfile](/Users/idss/YXT_Project/gmv-analytics/Dockerfile)
- [docker-entrypoint.sh](/Users/idss/YXT_Project/gmv-analytics/docker-entrypoint.sh)
2026-03-13 18:55:33 +08:00
2026-03-24 16:33:14 +08:00
容器启动后会:
2026-03-13 18:55:33 +08:00
2026-03-24 16:33:14 +08:00
- 加载 `.env`
- 自动把 `PROJECT_MAPPING_FILE` 修正为容器内的 `/app/店铺映射表.xlsx`
- 默认执行:
2026-03-13 18:55:33 +08:00
```bash
python prefect_gmv_scheduler.py --serve
```
2026-03-24 16:33:14 +08:00
## 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)。
启动:
2026-03-13 18:55:33 +08:00
```bash
cd /Users/idss/YXT_Project/gmv-analytics
docker compose up -d --build
```
停止:
```bash
docker compose down
```
2026-03-24 16:33:14 +08:00
## 3. 注册 Prefect 调度
2026-03-13 18:55:33 +08:00
2026-03-24 16:33:14 +08:00
推荐方式是使用 [prefect.yaml](/Users/idss/YXT_Project/gmv-analytics/prefect.yaml) 注册 deployment:
2026-03-13 18:55:33 +08:00
2026-03-24 16:33:14 +08:00
```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,可以在宿主机启动一个:
2026-03-13 18:55:33 +08:00
```bash
prefect worker start --pool default-agent-pool --type process
```
2026-03-24 16:33:14 +08:00
## 4. 自动执行是怎么发生的
2026-03-13 18:55:33 +08:00
2026-03-24 16:33:14 +08:00
如果你走的是 `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
2026-03-13 18:55:33 +08:00
```
2026-03-24 16:33:14 +08:00
只跑飞书通知:
2026-03-13 18:55:33 +08:00
2026-03-24 16:33:14 +08:00
```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 里手动执行:
2026-03-13 18:55:33 +08:00
```bash
docker run --rm \
--env-file /Users/idss/YXT_Project/gmv-analytics/.env \
-e PROJECT_MAPPING_FILE=/app/店铺映射表.xlsx \
gmv-analytics-prefect:latest \
2026-03-24 16:33:14 +08:00
python prefect_gmv_scheduler.py --mode sync
2026-03-13 18:55:33 +08:00
```
2026-03-24 16:33:14 +08:00
## 6. Docker 中的日志
现在日志分成两层:
### 6.1 容器标准输出日志
这是你最先看到的日志来源。
如果用 `docker run`:
2026-03-13 18:55:33 +08:00
```bash
2026-03-24 16:33:14 +08:00
docker logs -f gmv-prefect-scheduler
2026-03-13 18:55:33 +08:00
```
2026-03-24 16:33:14 +08:00
如果用 `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`,由容器自己维持调度。