# Docker 本地测试指南 ## 🚀 快速开始 ### 前提条件 1. **Docker已安装** ```bash docker --version # 应该 >= 20.10 docker-compose --version # 应该 >= 1.29 ``` 2. **配置文件已准备** - `.env` 文件存在(包含数据库配置) - 数据库可访问(阿里云RDS) ### 一键测试 ```bash # 运行测试脚本 ./docker-test.sh ``` **脚本会自动执行**: 1. ✅ 清理旧容器 2. ✅ 构建Docker镜像 3. ✅ 启动容器 4. ✅ 健康检查 5. ✅ 手动触发测试 --- ## 📖 详细步骤 ### 步骤1:确认配置文件 检查 `.env` 文件是否包含数据库配置: ```bash cat .env | grep DB_ ``` 应该看到: ``` DB_HOST=rm-t4nh1xx6o2a6vj8qu3o.mysql.singapore.rds.aliyuncs.com DB_PORT=3306 DB_USER=ad_rw DB_PASSWORD=p82SzuW4kAP3LJXcQGso DB_NAME=tencent_ad_autoput ``` ### 步骤2:构建镜像 ```bash docker-compose build ``` **说明**: - 首次构建需要5-10分钟(下载依赖) - 后续构建会使用缓存,更快 - 如需强制重新构建:`docker-compose build --no-cache` ### 步骤3:启动容器 ```bash docker-compose up -d ``` **参数说明**: - `-d`: 后台运行 - 省略 `-d` 会在前台显示日志 ### 步骤4:查看日志 ```bash # 实时查看日志 docker-compose logs -f # 查看最近100行 docker-compose logs --tail=100 # 只看错误日志 docker-compose logs | grep ERROR ``` ### 步骤5:健康检查 ```bash curl http://localhost:8080/health | jq . ``` **预期响应**: ```json { "status": "healthy", "timestamp": "2026-04-23T16:00:00Z", "scheduler_running": true, "latest_report": "llm_decisions_20260423.csv", "jobs": [ { "id": "decision_pipeline", "name": "广告决策流程", "next_run": "2026-04-24T03:00:00Z" } ] } ``` ### 步骤6:手动触发任务 ```bash curl -X POST http://localhost:8080/trigger ``` **预期响应**: ```json { "status": "triggered", "message": "任务已添加到队列" } ``` ### 步骤7:查看执行结果 ```bash # 查看输出文件 ls -lh outputs/reports/ # 查看决策结果(CSV) cat outputs/reports/llm_decisions_*.csv | head -20 # 查看执行日志 cat outputs/execution_log/execution_*.jsonl | tail -10 ``` --- ## 🔧 常用操作 ### 进入容器调试 ```bash # 进入容器shell docker exec -it auto_put_ad_mini bash # 在容器内执行命令 docker exec -it auto_put_ad_mini python -c "from db import get_whitelist_accounts; print(get_whitelist_accounts())" ``` ### 查看容器状态 ```bash # 查看运行状态 docker-compose ps # 查看资源占用 docker stats auto_put_ad_mini # 查看详细信息 docker inspect auto_put_ad_mini ``` ### 重启容器 ```bash # 重启 docker-compose restart # 停止后重新启动 docker-compose down docker-compose up -d ``` ### 查看网络 ```bash # 查看容器网络 docker network ls # 查看auto_put_ad_mini网络详情 docker network inspect auto_put_ad_mini_ad_network ``` --- ## 🐛 故障排查 ### 问题1:容器启动失败 **症状**:`docker-compose up -d` 后容器立即退出 **排查步骤**: ```bash # 1. 查看日志 docker-compose logs # 2. 查看容器退出原因 docker-compose ps -a # 3. 检查配置文件 cat .env | grep -E "DB_|FEISHU_|ODPS_" # 4. 尝试前台运行查看详细错误 docker-compose up ``` **常见原因**: - ❌ .env 文件缺失或配置错误 - ❌ 数据库连接失败 - ❌ 依赖安装失败 ### 问题2:健康检查失败 **症状**:`curl http://localhost:8080/health` 连接失败 **排查步骤**: ```bash # 1. 确认容器正在运行 docker-compose ps # 2. 确认端口映射 docker-compose ps | grep 8080 # 3. 查看容器日志 docker-compose logs --tail=50 # 4. 检查端口是否被占用 lsof -i :8080 ``` **解决方法**: ```bash # 如果8080端口被占用,修改docker-compose.yml ports: - "8081:8080" # 改用8081端口 ``` ### 问题3:数据库连接失败 **症状**:日志中出现 "数据库连接失败" **排查步骤**: ```bash # 1. 在容器内测试连接 docker exec -it auto_put_ad_mini bash python3 << EOF from db.connection import test_connection test_connection() EOF # 2. 检查网络连通性 docker exec -it auto_put_ad_mini ping -c 3 rm-t4nh1xx6o2a6vj8qu3o.mysql.singapore.rds.aliyuncs.com # 3. 检查.env配置 docker exec -it auto_put_ad_mini env | grep DB_ ``` **解决方法**: - 确认数据库白名单允许容器IP访问 - 确认数据库密码正确 - 使用外网地址而非内网地址(Docker环境) ### 问题4:Agent框架找不到 **症状**:`ModuleNotFoundError: No module named 'agent'` **原因**:Dockerfile中 `COPY ../../agent /app/agent` 路径错误 **解决方法**: ```bash # 从项目根目录构建 cd /Users/liulidong/project/agent/Agent docker build -t auto-put-ad-mini:latest -f examples/auto_put_ad_mini/Dockerfile . # 或者修改Dockerfile,使用相对于构建上下文的正确路径 ``` --- ## 📊 性能监控 ### 查看资源使用 ```bash # 实时监控 docker stats auto_put_ad_mini # 查看磁盘使用 docker exec -it auto_put_ad_mini du -sh /app/outputs/* ``` ### 查看日志大小 ```bash # 查看容器日志大小 docker inspect --format='{{.LogPath}}' auto_put_ad_mini | xargs ls -lh # 清理日志(如果太大) truncate -s 0 $(docker inspect --format='{{.LogPath}}' auto_put_ad_mini) ``` --- ## 🧹 清理环境 ### 停止并删除容器 ```bash docker-compose down ``` ### 删除镜像 ```bash docker rmi auto_put_ad_mini-auto_put_ad_mini ``` ### 清理所有(包括卷) ```bash docker-compose down -v # 删除所有卷(注意:会删除outputs数据) ``` ### 清理Docker系统 ```bash # 清理未使用的镜像、容器、网络 docker system prune -a ``` --- ## 🎯 测试场景 ### 场景1:测试定时任务 ```bash # 1. 修改定时时间为1分钟后 # 在DMS中执行: # UPDATE system_config SET config_value = '*/1 * * * *' WHERE config_key = 'cron_schedule'; # 2. 重启容器 docker-compose restart # 3. 查看日志,等待任务执行 docker-compose logs -f ``` ### 场景2:测试手动触发 ```bash # 1. 清空outputs目录 rm -rf outputs/reports/* # 2. 手动触发 curl -X POST http://localhost:8080/trigger # 3. 等待30秒后查看输出 sleep 30 ls -lh outputs/reports/ ``` ### 场景3:测试白名单 ```bash # 1. 在DMS中禁用所有账户 # UPDATE account_whitelist SET enabled = FALSE; # 2. 手动触发 curl -X POST http://localhost:8080/trigger # 3. 查看日志,应该显示"白名单为空" docker-compose logs --tail=50 # 4. 恢复白名单 # UPDATE account_whitelist SET enabled = TRUE WHERE account_id = 80769799; ``` --- ## 📝 环境变量说明 Docker容器会读取以下环境变量: | 变量 | 说明 | 示例 | |------|------|------| | `DB_HOST` | 数据库主机 | `rm-xxx.mysql.singapore.rds.aliyuncs.com` | | `DB_PORT` | 数据库端口 | `3306` | | `DB_USER` | 数据库用户 | `ad_rw` | | `DB_PASSWORD` | 数据库密码 | `xxx` | | `DB_NAME` | 数据库名称 | `tencent_ad_autoput` | | `TZ` | 时区 | `Asia/Shanghai` 或 `UTC` | | `EXECUTION_ENABLED` | 执行开关(环境变量降级) | `false` | | `WHITELIST_ENABLED` | 白名单开关(环境变量降级) | `true` | **优先级**:数据库配置 > 环境变量 > 默认值 --- ## ✅ 测试检查清单 - [ ] Docker和docker-compose已安装 - [ ] .env文件已配置数据库信息 - [ ] 构建镜像成功 - [ ] 容器启动成功 - [ ] 健康检查通过 - [ ] 手动触发成功 - [ ] 日志输出正常 - [ ] outputs目录有输出文件 - [ ] 定时任务配置正确(查看next_run) - [ ] 白名单配置生效 - [ ] 执行开关正确(EXECUTION_ENABLED=false) --- **测试完成后记得停止容器**: ```bash docker-compose down ``` **保留输出文件**: outputs 目录通过volume映射到本地,停止容器不会丢失数据。