返回 Skill 列表
extension
分类: 开发与工程无需 API Key

全栈项目 Docker 打包部署

专为全栈项目(前端 Vue/React + 后端 Java/Python)设计的 Docker 容器化打包部署技能。 支持多项目、偏好记忆,一键生成可部署的 tar 包及配套配置,涵盖环境检查、Git 同步、自动打包、产物导出等全流程。

person作者: winterbzfarhubModelScope

全栈项目 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 同步流程

  1. git stash push -u(全部暂存)
  2. 根据用户选择执行:拉取当前分支 / 切换到指定分支并拉取
  3. 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.ymlcontainer_name 使用镜像名去掉 :latest
  • docker-compose.ymlports 使用用户指定的宿主机端口
  • 多项目时合并 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 scouttrivy 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.confdocker-compose.yml 内容前进入构建阶段
  • 禁止docker build 失败后不清理缓存就直接重试
  • 禁止 修改项目原有的 .gitignore.dockerignore 文件
  • 禁止 将任何产物或配置文件写入项目子目录(必须放在 .deploy-skill/ 下)
  • 禁止 在环境前置检查未通过时继续执行后续阶段

详细参考文档