全栈项目 Docker 打包部署技能
触发时机
当用户提出以下任一意图时,必须启动此技能:
- "帮我打包这个项目"
- "准备部署到服务器"
- "我要构建 Docker 镜像"
- "这个项目怎么上线?"
- "生成部署包"
- "打镜像"
特殊指令
| 指令 | 触发关键词 | 执行动作 | | :--- | :--- | :--- | | 重置偏好 | "重置部署偏好"、"清除部署记忆"、"忘记我的选择"、"恢复默认设置" | 删除偏好文件,可选清理产物目录 |
核心流程(简版)
阶段1:初始化工作目录
- 确定当前工作目录根路径
- 创建
.deploy-skill/目录(与子项目并列)
阶段2:环境前置检查(Hard Gate 0)
执行以下 3 项检查,任一失败时给出明确提示并终止流程:
| 检查项 | 命令 | 失败处理 |
| :--- | :--- | :--- |
| Docker 运行状态 | docker info | 提示"Docker 未运行,请启动 Docker Desktop 或 dockerd 服务"并终止 |
| Git 安装状态 | git --version | 提示"未安装 Git,请先安装 Git CLI"并终止 |
| Docker Buildx 可用性 | docker buildx version | 警告"Buildx 不可用,将回退到普通 build",不终止 |
如果用户明确表示仅生成配置文件不构建镜像,可跳过 Docker 检查。
阶段3:偏好加载与用户决策
- 读取
.deploy-skill/preferences.json偏好文件 - 三层优先级合并:项目级 > 全局级 > 默认值
- 特殊处理
targetBranch(空值回退) - 交互决策:首次运行逐项询问,后续运行三选项(使用已有/修改部分/恢复默认)
阶段4:项目识别与选择
- 扫描包含
Dockerfile/package.json/pom.xml/requirements.txt/pyproject.toml的一级子目录 - 读取上次选择,让用户选择本次项目
阶段5:代码同步与冲突处理(Hard Gate 1)
非 Git 项目检测
检测项目目录下 .git 是否存在:
- 存在 → 执行下述 Git 同步流程
- 不存在 → 跳过本阶段,日志记录"非 Git 项目,跳过代码同步",直接进入阶段6
分支同步决策
检测当前分支后,询问用户选择同步方式:
| 选项 | 说明 | 执行操作 |
| :--- | :--- | :--- |
| 拉取当前分支(默认) | 不切换分支,直接拉取当前分支最新代码 | git pull |
| 切换到指定分支并拉取 | 切换到目标分支后拉取 | git checkout <目标分支> && git pull |
| 跳过 Git 同步 | 不执行任何 Git 操作,基于本地当前代码构建 | 无 |
- 默认选项为"拉取当前分支"
- 若用户选择"切换到指定分支",列出远程可用分支供用户选择
- 用户选择记录到偏好(
syncMode字段),下次运行作为默认
Git 同步流程
git stash push -u(全部暂存)- 根据用户选择执行:拉取当前分支 / 切换到指定分支并拉取
git stash pop恢复
Git pull 失败处理
git pull 失败时,检测失败原因并提供降级方案:
| 失败类型 | 检测关键词 | 处理方式 |
| :--- | :--- | :--- |
| 认证失败 | Permission denied / Authentication failed | 提示用户选择:a) 配置 SSH 密钥后重试 b) 切换 HTTPS + token 方式 c) 跳过同步,基于本地代码构建(降级模式) |
| 网络不通 | Could not resolve host / Connection refused / timeout | 提示检查网络,可选择跳过同步 |
| 分支不存在 | pathspec did not match | 列出可用分支供用户选择 |
| 其他错误 | 退出码非0 | 展示完整错误日志,提示用户手动处理 |
stash 冲突处理
- 冲突时暂停,用户手动解决
- 冲突处理指引:
- 冲突发生时先执行
git stash list确认 stash 记录仍在 - 提示用户解决冲突后可手动
git stash drop清理 - 提供中止恢复的回退指引,避免代码丢失
- 冲突发生时先执行
阶段6:上下文净化(Hard Gate 0.5)
- 加载
.deploy-skill/<项目名>/.ignore - 通过
--ignorefile或临时覆盖方式应用 - 不修改项目原有的
.gitignore/.dockerignore
阶段7:环境配置准备(Hard Gate 2)
- 检查/生成
Dockerfile - 询问端口映射:宿主机端口(默认 80),容器内固定 80,记录到偏好
- 在
.deploy-skill/<项目名>/目录下生成nginx.conf(前端项目)、docker-compose.yml docker-compose.yml中container_name使用镜像名去掉:latestdocker-compose.yml中ports使用用户指定的宿主机端口- 多项目时合并 compose(可选)
阶段8:Docker 镜像构建(Hard Gate 3)
- 生成镜像名(覆盖模式:
latest,历史模式:版本号) - 执行
docker build --platform <目标平台>
构建失败分类处理
| 失败类型 | 检测关键词 | 处理方式 |
| :--- | :--- | :--- |
| Docker 未运行 | Cannot connect to the Docker daemon | 提示启动 Docker,终止流程 |
| 磁盘空间不足 | no space left on device | 提示执行 docker system prune -a 清理后重试 |
| Dockerfile 语法错误 | failed to compute cache key / COPY failed | 定位错误行号,提示修正后重试 |
| 网络拉取失败 | failed to fetch / i/o timeout | 提示检查网络或配置镜像加速地址后重试 |
| 其他构建错误 | 退出码非0 | 展示完整错误日志,引导用户排查 |
- 构建失败后禁止不清理缓存就直接重试
阶段9:镜像安全扫描(可选)
- 构建成功后,执行镜像漏洞扫描(
docker scout或trivy image) - 输出扫描报告,若存在高危漏洞则提示用户确认是否继续
- 扫描失败不阻塞流程,仅告警
阶段10:导出产物
磁盘空间预检查
导出前检查镜像大小与磁盘可用空间:
1. 获取镜像大小: docker image inspect <镜像名> --format='{{.Size}}'
2. 获取磁盘可用空间
3. 若可用空间 < 镜像大小 × 1.2,提示用户清理空间
4. 空间不足时不执行导出,避免写入不完整文件
导出
- 覆盖模式:固定文件名
<项目名>.tar(镜像名去掉:latest) - 历史模式:带时间戳的文件名
- 导出到
.deploy-skill/<项目名>/目录
阶段11:记录操作日志
- 写入
.deploy-skill/<项目名>/deploy.log(追加,不覆盖) - 日志中涉及的仓库地址等敏感信息需脱敏处理
阶段12:生成部署指引
- 基于模板 deploy.md 生成部署指引文档
- 写入
.deploy-skill/<项目名>/deploy.md - 指引内容包含:前置条件、文件传输(
scp)、镜像加载(docker load)、服务启停(docker compose up/down)、日志查看(logs -f) - 所有产物文件(tar、compose、nginx、指引)在同一目录,便于整体传输
- 部署认证方式:建议使用 SSH 密钥认证,禁止使用明文密码
- 生成后向用户展示文档路径及关键命令摘要
阶段13:保存偏好
- 将本次选择写入
.deploy-skill/preferences.json
反模式(Anti-patterns)
- 禁止 在
git stash阶段做任何筛选(全部暂存、全部恢复) - 禁止 在
git stash pop发生冲突时,AI 自行合并或丢弃更改 - 禁止 在用户未确认
nginx.conf和docker-compose.yml内容前进入构建阶段 - 禁止 在
docker build失败后不清理缓存就直接重试 - 禁止 修改项目原有的
.gitignore或.dockerignore文件 - 禁止 将任何产物或配置文件写入项目子目录(必须放在
.deploy-skill/下) - 禁止 在环境前置检查未通过时继续执行后续阶段
微信扫一扫