添加qiming-rcoder模块
This commit is contained in:
234
qiming-rcoder/crates/docker_manager/README.md
Normal file
234
qiming-rcoder/crates/docker_manager/README.md
Normal file
@@ -0,0 +1,234 @@
|
||||
# Docker Manager
|
||||
|
||||
基于 bollard 库的 Docker 容器动态管理模块,用于 RCoder 项目中的 Docker Agent 管理。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- ✅ 动态创建和销毁 Docker 容器
|
||||
- ✅ 支持项目工作目录挂载
|
||||
- ✅ 容器状态监控和日志获取
|
||||
- ✅ 支持环境变量和端口映射配置
|
||||
- ✅ 自动镜像拉取和资源限制
|
||||
- ✅ 容器生命周期管理
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 1. DockerManager
|
||||
主要的 Docker 管理器,提供容器的完整生命周期管理。
|
||||
|
||||
```rust
|
||||
use docker_manager::{DockerManager, DockerManagerConfig};
|
||||
|
||||
// 创建 Docker 管理器
|
||||
let config = DockerManagerConfig::default();
|
||||
let docker_manager = DockerManager::new(config).await?;
|
||||
|
||||
// 创建容器
|
||||
let container_info = docker_manager.create_container(config).await?;
|
||||
|
||||
// 停止容器
|
||||
docker_manager.stop_container("project_id").await?;
|
||||
```
|
||||
|
||||
### 2. DockerContainerConfig
|
||||
容器配置结构体,定义容器的各种参数。
|
||||
|
||||
```rust
|
||||
use docker_manager::DockerContainerConfig;
|
||||
|
||||
let config = DockerContainerConfig {
|
||||
project_id: "my_project".to_string(),
|
||||
image: "registry.yichamao.com/rcoder:latest".to_string(),
|
||||
host_path: "/path/to/project".to_string(),
|
||||
container_path: "/app/workspace".to_string(),
|
||||
env_vars: env_map,
|
||||
port_bindings: port_map,
|
||||
..Default::default()
|
||||
};
|
||||
```
|
||||
|
||||
### 3. DockerUtils
|
||||
工具函数集合,简化常见操作。
|
||||
|
||||
```rust
|
||||
use docker_manager::DockerUtils;
|
||||
|
||||
// 根据项目ID创建配置
|
||||
let config = DockerUtils::create_config_from_project_id(
|
||||
"project_123",
|
||||
"./project_workspace",
|
||||
Some("custom:image".to_string()),
|
||||
);
|
||||
```
|
||||
|
||||
## 使用场景
|
||||
|
||||
### 1. RCoder Docker Agent
|
||||
|
||||
在 RCoder 项目中,Docker Agent 用于为每个项目创建独立的运行环境:
|
||||
|
||||
```rust
|
||||
use docker_manager::{DockerAgentManager, DockerUtils};
|
||||
use rcoder::model::{AgentType, ChatPrompt};
|
||||
|
||||
// 创建 Docker Agent 管理器
|
||||
let docker_agent_manager = DockerAgentManager::new().await?;
|
||||
|
||||
// 为项目创建 Docker Agent
|
||||
let chat_prompt = ChatPrompt {
|
||||
project_id: "project_123".to_string(),
|
||||
agent_type: AgentType::Docker,
|
||||
// ... 其他字段
|
||||
};
|
||||
|
||||
let docker_agent = docker_agent_manager.create_docker_agent(
|
||||
&chat_prompt,
|
||||
AgentType::Docker
|
||||
).await?;
|
||||
```
|
||||
|
||||
### 2. 项目隔离
|
||||
|
||||
每个项目在独立的 Docker 容器中运行,确保环境隔离:
|
||||
|
||||
- 挂载路径: `./project_workspace/{project_id}` → `/app/workspace`
|
||||
- 镜像: `registry.yichamao.com/rcoder:latest`
|
||||
- 网络: 使用 host 模式以获得更好的性能
|
||||
|
||||
### 3. 环境变量配置
|
||||
|
||||
Docker Agent 支持丰富的环境变量配置:
|
||||
|
||||
```rust
|
||||
let mut env_vars = HashMap::new();
|
||||
env_vars.insert("ANTHROPIC_AUTH_TOKEN".to_string(), "your_token".to_string());
|
||||
env_vars.insert("PROJECT_ID".to_string(), "project_123".to_string());
|
||||
env_vars.insert("DOCKER_AGENT_TYPE".to_string(), "claude".to_string());
|
||||
```
|
||||
|
||||
## 配置选项
|
||||
|
||||
### DockerManagerConfig
|
||||
|
||||
```rust
|
||||
pub struct DockerManagerConfig {
|
||||
pub docker_host: Option<String>, // Docker 守护进程地址
|
||||
pub default_image: String, // 默认镜像
|
||||
pub default_network_mode: String, // 默认网络模式
|
||||
pub default_work_dir: String, // 默认工作目录
|
||||
pub auto_cleanup: bool, // 是否启用自动清理
|
||||
pub container_ttl_seconds: Option<u64>, // 容器存活时间
|
||||
}
|
||||
```
|
||||
|
||||
### 环境变量配置
|
||||
|
||||
可以通过环境变量配置 Docker 管理器:
|
||||
|
||||
- `DOCKER_HOST`: Docker 守护进程地址
|
||||
- `DEFAULT_DOCKER_IMAGE`: 默认镜像
|
||||
- `DOCKER_NETWORK_MODE`: 网络模式
|
||||
- `DOCKER_WORK_DIR`: 工作目录
|
||||
- `DOCKER_AUTO_CLEANUP`: 自动清理
|
||||
- `DOCKER_CONTAINER_TTL`: 容器TTL
|
||||
|
||||
## 集成到 RCoder
|
||||
|
||||
### 1. 启用 Docker Agent
|
||||
|
||||
设置环境变量启用 Docker Agent:
|
||||
|
||||
```bash
|
||||
export USE_DOCKER_AGENT=true
|
||||
```
|
||||
|
||||
### 2. 项目目录结构
|
||||
|
||||
```
|
||||
./project_workspace/
|
||||
├── project_123/ # 项目 123 的工作目录
|
||||
│ ├── src/
|
||||
│ ├── Cargo.toml
|
||||
│ └── ...
|
||||
├── project_456/ # 项目 456 的工作目录
|
||||
│ └── ...
|
||||
```
|
||||
|
||||
### 3. Docker 镜像
|
||||
|
||||
使用预构建的 RCoder Docker 镜像:
|
||||
- 镜像地址: `registry.yichamao.com/rcoder:latest`
|
||||
- 包含完整的 AI 开发工具链
|
||||
- 支持 Claude Code 和 Codex Agent
|
||||
|
||||
## 错误处理
|
||||
|
||||
所有操作都返回 `DockerResult<T>`,包含详细的错误信息:
|
||||
|
||||
```rust
|
||||
match docker_manager.create_container(config).await {
|
||||
Ok(container_info) => {
|
||||
println!("容器创建成功: {}", container_info.container_name);
|
||||
}
|
||||
Err(DockerError::ContainerCreationError(msg)) => {
|
||||
eprintln!("容器创建失败: {}", msg);
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("其他错误: {}", e);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 日志和监控
|
||||
|
||||
### 获取容器日志
|
||||
|
||||
```rust
|
||||
// 获取最后 50 行日志
|
||||
let logs = docker_manager.get_container_logs("project_id", 50).await?;
|
||||
println!("容器日志:\n{}", logs);
|
||||
```
|
||||
|
||||
### 监控容器状态
|
||||
|
||||
```rust
|
||||
// 检查容器状态
|
||||
let status = docker_manager.update_container_status("project_id").await?;
|
||||
if let Some(status) = status {
|
||||
println!("容器状态: {:?}", status);
|
||||
}
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
1. **资源管理**: 及时停止不用的容器以释放资源
|
||||
2. **错误处理**: 始终检查操作结果并处理错误
|
||||
3. **日志监控**: 定期检查容器日志以了解运行状态
|
||||
4. **环境隔离**: 为每个项目使用独立的容器
|
||||
5. **镜像管理**: 使用固定版本的镜像以避免意外更新
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **Docker 连接失败**
|
||||
- 检查 Docker 守护进程是否运行
|
||||
- 验证 Docker socket 权限
|
||||
|
||||
2. **镜像拉取失败**
|
||||
- 检查网络连接
|
||||
- 验证镜像地址和认证信息
|
||||
|
||||
3. **容器启动失败**
|
||||
- 检查资源限制(内存、CPU)
|
||||
- 验证挂载路径权限
|
||||
- 查看容器日志了解详细错误
|
||||
|
||||
### 调试模式
|
||||
|
||||
启用详细日志进行调试:
|
||||
|
||||
```bash
|
||||
export RUST_LOG=debug
|
||||
cargo run --example basic_usage
|
||||
```
|
||||
Reference in New Issue
Block a user