关于 ln-783-container-launcher
用于构建 Docker 镜像、启动 Compose 服务并检查健康状态的技能,适合独立容器启动和开发环境设置,不用于生产部署或多主机编排。
主要功能
- 01Docker 和 Compose 环境检查
- 02解析 Compose 配置
- 03构建镜像并启动容器
- 04带重试和退避的健康检查
- 05提供访问 URL 和清理说明
适用场景
- 01启动基于 Compose 的开发环境
- 02检查容器启动后的服务就绪状态
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ levnikolaevich/ claude-code-skills --skill ln-783-container-launcher安装后在 Claude Code 中输入/ln-783-container-launcher确认已加载。
附带文件references/monitor_integration_pattern.md
详细介绍
路径: 文件路径(
references/、../ln-*)相对于此技能目录。
ln-783-container-launcher
类型: L3 Worker 类别: 7XX 项目引导
用途
构建 Docker 镜像、启动容器,并使用 Docker 原生健康检查和重试策略进行全面的健康验证。
范围:
- 检测并验证 docker-compose.yml 配置
- 构建 Docker 镜像
- 按正确的启动顺序启动容器
- 使用原生健康检查验证容器健康状况
- 提供访问 URL 和清理说明
范围之外:
- 构建应用程序代码(由 ln-781 处理)
- 运行测试(由 ln-782 处理)
- 单主机之外的容器编排(Kubernetes、Swarm)
何时使用
| 场景 | 使用此技能 |
|---|---|
| 可独立使用 | 是 |
| 独立启动容器 | 是 |
| 开发环境设置 | 是 |
| 生产部署 | 否,使用适当的 CI/CD |
工作流
步骤 1:启动前检查
验证 Docker 环境是否就绪。
| 检查 | 失败时的操作 |
|---|---|
| Docker 守护进程正在运行 | 报告错误并提供安装说明 |
| Docker Compose 可用 | 报告错误并建议安装 |
| Compose 文件存在 | 报告错误并列出预期位置 |
| 所需端口空闲 | 报告冲突并建议替代端口 |
| 磁盘空间充足 | 空间不足(可用空间 <2GB)时发出警告 |
步骤 2:解析 Compose 配置
从 docker-compose.yml 中提取服务信息。
| 信息 | 用途 |
|---|---|
| 服务名称 | 跟踪要监控的容器 |
| 暴露的端口 | 确定要检查的端口 |
| 健康检查定义 | 如果已定义,则使用原生健康检查 |
| 依赖项(depends_on) | 了解启动顺序 |
| 卷挂载 | 验证路径是否存在 |
步骤 3:构建镜像
构建 compose 文件中定义的所有镜像。
| 方面 | 策略 |
|---|---|
| 构建上下文 | 使用 compose 文件中的路径 |
| 构建参数 | 从 compose 配置传入 |
| 缓存 | 使用 Docker 层缓存以提高速度 |
| 失败 | 报告构建错误并提供完整日志 |
步骤 4:启动容器
使用适当的编排方式启动容器。
| 方面 | 策略 |
|---|---|
| 启动顺序 | 遵循 depends_on 和 healthcheck 条件 |
| 后台模式 | 在后台运行 |
| 网络 | 使用 compose 定义的网络 |
| 卷 | 挂载所有已定义的卷 |
步骤 5:健康验证
使用合适的策略验证所有容器是否健康。
策略选择:
| 条件 | 策略 |
|---|---|
服务在 compose 中包含 healthcheck: | 使用 Docker 原生健康状态 |
服务包含 depends_on: condition: service_healthy | 等待 Docker 健康状态 |
| 未定义 healthcheck | 使用外部 HTTP 探测并重试 |
重试配置:
| 参数 | 值 | 理由 |
|---|---|---|
| 最大尝试次数 | 10 | 为启动较慢的服务留出时间 |
| 初始延迟 | 5s | 给容器启动时间 |
| 退避 | 指数退避(5、10、20、40s) | 避免服务过载 |
| 总等待时间上限 | 120s | 合理的上限 |
健康检查方法:
| 方法 | 使用时机 |
|---|---|
| Docker 健康状态 | 容器已定义 healthcheck 时 |
| 对暴露端口发送 HTTP GET 请求 | 未定义 healthcheck 的 Web 服务 |
| 容器 exec | 未暴露端口的服务 |
| TCP 端口检查 | 数据库和消息队列 |
步骤 6:报告结果
向编排器返回结构化结果。
结果结构:
| 字段 | 描述 |
|---|---|
| containers | 容器状态对象数组 |
| healthChecks | 健康检查结果数组 |
| accessUrls | 服务名称到访问 URL 的映射 |
| overallStatus | healthy / unhealthy / partial |
| startupDuration | 从启动到全部健康所用的时间 |
容器状态对象:
| 字段 | 描述 |
|---|---|
| name | 容器名称 |
| service | compose 中的服务名称 |
| status | running / exited / restarting |
| health | healthy / unhealthy / starting / none |
| port | 暴露的端口(如果有) |
| startedAt | 容器启动时间戳 |
健康检查结果:
| 字段 | 描述 |
|---|---|
| url | 检查的 URL 或端点 |
| status | HTTP 状态码或检查结果 |
| responseTime | 响应时间,单位为 ms |
| healthy | 健康状态布尔值 |
错误处理
| 错误类型 | 操作 |
|---|---|
| Docker 守护进程未运行 | 报告问题并提供启动说明 |
| 端口已被占用 | 报告冲突,并建议先运行 docker compose down |
| 镜像构建失败 | 报告问题并附上构建日志 |
| 容器已退出 | 报告问题并附上容器日志 |
| 健康检查超时 | 报告问题,并附上最后已知状态和日志 |
| 网络无法访问 | 检查 Docker 网络配置 |
选项
| 选项 | 默认值 | 描述 |
|---|---|---|
| keepRunning | true | 验证后让容器继续运行 |
| stopAfter | false | 验证成功后停止容器 |
| healthTimeout | 120 | 等待健康状态的最长秒数 |
| showLogs | true | 失败时显示容器日志 |
| buildFirst | true | 启动前构建镜像 |
| pullLatest | false | 构建前拉取基础镜像 |
清理说明
在报告中向用户提供清理命令。
| 操作 | 描述 |
|---|---|
| 停止容器 | 停止运行中的容器,但保留数据 |
| 移除容器和网络 | 清理容器,但保留卷 |
| 移除所有内容 | 完全清理,包括卷和镜像 |
关键规则
- 有原生健康检查时使用原生健康检查 - 比外部探测更可靠
- 实现带退避的重试机制 - 服务需要时间初始化
- 失败时始终收集日志 - 这对调试至关重要
- 解析 compose 文件以获取端口 - 不要对端口号进行硬编码
- 遵循 depends_on 顺序 - 这对依赖数据库的服务至关重要
监控集成(Claude Code 2.1.98+)
必须阅读: 加载 references/monitor_integration_pattern.md
对于容器健康验证,使用 Monitor 流式传输容器日志:
| 模式 | 命令 | timeout_ms |
|---|---|---|
| 就绪信号 | docker compose logs -f 2>&1 | grep --line-buffered -iE 'ready|listening|healthy|started' | healthTimeout * 1000 |
| 错误监视 | docker compose logs -f 2>&1 | grep --line-buffered -iE 'error|fatal|panic|exit' | healthTimeout * 1000 |
如果 keepRunning 为 true 且需要持续监控日志,请使用 persistent: true。
回退方案:如果 Monitor 不可用,则使用带 sleep 和 curl 健康检查的重试循环。
完成标准
- 已验证 Docker 环境
- 已成功构建所有镜像
- 所有容器均在运行
- 所有健康检查均已通过
- 已提供访问 URL
- 已向编排器返回结果
参考文件
- 上级:
../ln-780-bootstrap-verifier/SKILL.md
版本: 2.0.0 最后更新: 2026-01-10
评论
支持 Markdown