You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用github/action-doctl@v2结合docker-compose部署DigitalOcean镜像构建推送异常

问题原因

工作流构建/推送步骤0秒无操作,核心是几个配置错误:

  • jobs下声明的main-fe_build/admin-fe_build/main-be_build/main-fe_test四个任务没有配置必填的runs-on字段和执行步骤,属于空定义,GitHub Actions会直接将其标记为完成,依赖这些空任务的后续流程会直接跳过实际逻辑。
  • 命令版本不兼容:ubuntu-latest运行器默认预装的是Docker Compose V1,调用命令为带横杠的docker-compose,你使用的空格分隔的docker compose是V2插件语法,未手动安装插件时命令无法正常执行。
  • 镜像标签配置错误:docker compose push依赖服务配置中image字段的仓库地址,如果你没有将该字段配置为DigitalOcean容器 registry(DOCR)的完整路径,推送步骤找不到可推送的目标镜像,会直接无操作退出。
  • 最后SSH到Droplet的步骤仅执行了目录跳转和文件列表查看,没有写拉取镜像、重启服务的实际部署逻辑,就算镜像推送成功也不会更新线上应用。
前置配置要求

首先修改你的docker-compose.yml,给所有需要构建的服务配置正确的DOCR镜像地址,格式参考:

services:
  frontend:
    build: ./frontend # 替换为你实际的前端构建上下文路径
    image: registry.digitalocean.com/你的DOCR仓库名称/frontend:latest
  admin_frontend:
    build: ./admin-frontend # 替换为你实际的管理端构建上下文路径
    image: registry.digitalocean.com/你的DOCR仓库名称/admin-frontend:latest
  backend:
    build: ./backend # 替换为你实际的后端构建上下文路径
    image: registry.digitalocean.com/你的DOCR仓库名称/backend:latest
  nginx:
    build: ./nginx # 替换为你实际的Nginx配置路径
    image: registry.digitalocean.com/你的DOCR仓库名称/nginx:latest
  # 其余配置(端口、挂载、依赖关系等)保持原有内容不变

同时提前在你的Droplet上安装好Docker、Docker Compose V2、doctl工具,将生产环境用的docker-compose.yml和.env文件上传到/root/apps/myapp目录。

修复后的工作流配置

如果你暂时不需要拆分单步构建、测试任务,可以直接删除无效的空job,使用如下配置:

name: deploy app to digital ocean droplet

on:
  push:
    branches:
      - master

jobs:
  build_and_push:
    name: Build & Push
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the repo
        uses: actions/checkout@v4

      - name: Init Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Create env file
        run: |
          touch .env
          echo "${{ secrets.SERVER_ENV_PROD }}" > .env

      - name: Install Docker Compose V2
        run: |
          sudo apt-get update
          sudo apt-get install docker-compose-plugin -y
          docker compose version

      - name: Install doctl
        uses: digitalocean/action-doctl@v2
        with:
          token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}

      - name: Log in to DO Container Registry
        run: doctl registry login --expiry-seconds 600

      - name: Build all images
        run: docker compose -f docker-compose.yml build --parallel

      - name: Push images to DOCR
        run: docker compose -f docker-compose.yml push

      - name: Deploy to Droplet
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.SSHKEY }}
          port: ${{ secrets.PORT }}
          script: |
            cd /root/apps/myapp
            doctl registry login
            docker compose -f docker-compose.yml pull
            docker compose -f docker-compose.yml up -d --remove-orphans
            docker image prune -af

如果你需要保留前端测试等拆分任务,必须给每个任务补全runs-on: ubuntu-latest和对应的执行步骤,不能留空定义。

其他注意事项
  • 工作流中引用的第三方Action尽量使用固定版本tag,不要用@master这种指向分支的引用,避免上游代码更新导致流程异常。
  • DOCR的登录凭证有效期设置为10分钟足够完成推送操作,不需要调大时长,降低安全风险。
  • Droplet端部署脚本最后加的镜像清理命令会自动删除无用的旧镜像,避免长期运行占满磁盘。

工作流执行记录截图

内容的提问来源于stack exchange,提问作者Tivi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:33:25