使用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
相关产品推荐
相关产品推荐

