SuperAPI AI 工具集

docker-build-deploy

部署与运维

查看项目

更新于 10-13 21:33

技能介绍

Docker Build & Deploy 是一个用于生成 Docker CI/CD 工作流的技能(Skill):一键生成“Docker 构建 + 推送到 GHCR + 部署到服务器”的 GitHub Actions 工作流。其核心产物包括一份经过优化的 Dockerfile(多阶段构建、非 root 用户、健康检查)以及一份 GitHub Actions 工作流模板。

用途

该技能适用于需要将项目容器化并部署到服务器的场景,例如:希望用 GitHub Actions 自动构建 Docker 镜像;提到 Docker、GHCR、容器部署或 CI/CD;输入 /docker-build-deploy 命令;需要搭建持续部署流水线;需要把镜像推送到容器镜像仓库;需要通过 SSH 自动部署到远程服务器;希望用多阶段构建优化现有 Dockerfile;希望为容器部署添加健康检查。

不适用的场景包括:只想编写 Dockerfile;使用 Kubernetes 部署(属于不同工作流,可考虑 kubectl 或 Helm);不使用 GitHub Actions(可考虑 GitLab CI、CircleCI 等);部署到 AWS ECS/EKS、Google Cloud Run 或 Azure Container Instances(属于不同工作流)。

主要能力与工作方式

技能按以下步骤工作:

第一步,收集信息。交互式询问 port(容器内端口,默认 3000)、host_port(对外暴露端口,默认与 port 相同)、env_file(服务器 env 路径,可选)。同时进行智能检测:存在 package.json 时判定为 Node.js(当前唯一支持的项目类型);若已存在 Dockerfile,则跳过生成。

第二步,按需生成 Dockerfile。生成针对 Node.js 优化的 Dockerfile,包含多阶段构建、非 root 用户、健康检查,模板见 templates/Dockerfile.nodejs。

第三步,生成工作流。基于 templates/docker-deploy.yml 生成工作流,并替换 {{PORT}}(容器端口)、{{HOST_PORT}}(对外端口)和 {{ENV_FILE}} 变量。其中 build-and-push job 负责:登录 GHCR、Buildx 构建、推送(tag 为 latest 与 sha)、启用 GHA 缓存;deploy job 负责:SSH 连接、拉取镜像、停止旧容器、启动新容器(支持 env 文件)、清理旧镜像。

第四步,提示配置 Secrets。告知用户需在 GitHub Settings → Secrets 中配置 DEPLOY_HOST、DEPLOY_USER、DEPLOY_SSH_KEY(服务器私钥)。安全性上,建议使用 SSH key 而非密码(密码登录存在爆破风险,且会明文存于 CI);若服务器仅支持密码,可改用 password: ${{ secrets.DEPLOY_PASSWORD }},但不推荐。

使用方式

命令形式包括: /docker-build-deploy /docker-build-deploy --port 8080 /docker-build-deploy --port 8080 --env-file /opt/app/.env

参数说明:--port 为容器内应用端口,默认 3000;--host-port 为服务器对外暴露端口,默认与 --port 相同;--env-file 为服务器 env 文件路径,默认为空。

常见错误与正确做法

  1. 只用 latest 单 tag,应同时打 latest 与 ${{ github.sha }},便于回滚。2) 未设置 packages: write 权限,应声明 permissions: packages: write,GHCR 推送需要。3) deploy 不检查容器是否存在,应先 docker stop 加 docker rm,避免端口冲突。4) 不清理旧镜像,应在部署后执行 docker image prune -f,节省磁盘空间。5) Dockerfile 用 root 运行,应添加 USER node 或非 root 用户,符合容器安全最佳实践。6) Secrets 硬编码在 workflow 中,应使用 ${{ secrets.XXX }} 引用,避免密钥泄露。7) 不设置 Docker BuildKit 缓存,应配置 cache-from / cache-to 使用 GitHub Actions cache,否则每次全量构建过慢。8) 不处理构建失败的回滚,应在部署后验证健康检查,否则失败部署可能上线错误版本。9) 用密码 SSH 部署,应使用 SSH key(DEPLOY_SSH_KEY),密码爆破风险高。10) 平台声明与服务器架构不符,应按服务器架构声明 linux/amd64 或 linux/arm64;多平台构建时写 linux/amd64,linux/arm64,否则目标架构不匹配会导致运行失败。

限制

当前仅支持 Node.js 项目类型(以 package.json 为判断依据);依赖 GitHub Actions 与 GHCR;不含 Kubernetes、AWS ECS/EKS、Google Cloud Run、Azure Container Instances 等部署方式;仅支持 SSH 方式部署到服务器。