Files
gmv-analytics/DOCKER_PREFECT_USAGE.md
T
2026-03-24 17:14:27 +08:00

254 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
cd /Users/idss/YXT_Project/gmv-analytics
docker compose watch
```
停止:
```bash
docker compose down
```
热加载规则是:
- 修改 `.py`、`.env`、Excel 映射表等项目内容:
- 自动同步到容器
- 并自动重启服务
- 修改 `Dockerfile`、`pyproject.toml`、`supervisord.conf`、`docker-compose.yaml`、`requirements-docker.txt`:
- 自动触发 rebuild
## 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`,由容器自己维持调度。