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

GitHub Actions作业在Docker Compose构建返回非0退出码时仍标记为成功的问题

问题分析与解决方案

你的问题核心在于docker compose up --build -d这个命令的行为——它的设计是将服务后台启动,即使某个服务构建失败,这个命令本身可能仍然返回退出码0,导致GitHub Actions误以为步骤执行成功,没有捕获到实际的构建错误(退出码2)。

为什么会这样?

当你使用-d(后台运行)参数时,Docker Compose会尝试启动所有服务,但它不会等待构建或启动完成后检查结果就返回成功。所以即使你的容器构建过程中npm run staging:start失败返回了退出码2,docker compose up -d本身的退出码还是0,GitHub Actions就会标记这个步骤为成功。

解决方法

你需要调整GitHub Actions中的命令,确保构建失败时能返回非零退出码,让Actions正确识别失败状态。这里有几个可行的方案:

方案1:先单独执行构建,再启动服务

先使用docker compose build命令单独完成构建,这个命令会在任何服务构建失败时直接返回非零退出码,然后再执行启动命令:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
      - name: Docker build staging
        run: |
          # 先执行构建,失败则直接终止步骤
          docker compose -f docker-compose.yml build
          # 构建成功后再后台启动服务
          docker compose -f docker-compose.yml up -d

方案2:不使用后台启动参数,前台运行直到构建完成

去掉-d参数,让Docker Compose前台运行,这样构建失败时会直接返回非零退出码,不过这种方式适合不需要长期后台运行的场景(比如CI中只做构建验证):

- name: Docker build staging
  run: |
    docker compose -f docker-compose.yml up --build

方案3:构建后验证服务状态

如果必须使用后台启动,可以在启动后检查服务的运行状态,发现异常则手动返回非零退出码:

- name: Docker build staging
  run: |
    docker compose -f docker-compose.yml up --build -d
    # 等待几秒让服务启动完成
    sleep 10
    # 检查所有服务是否运行正常,有失败则退出
    if ! docker compose -f docker-compose.yml ps --services --filter "status=running" | grep -q "^$(docker compose -f docker-compose.yml ps --services)$"; then
      echo "One or more services failed to start"
      exit 1
    fi

针对你的场景推荐方案1

因为你需要后台启动服务,但又要确保构建过程没有错误,方案1是最直接的——先单独构建,确保所有镜像都成功生成后再启动服务,这样任何构建失败都会立刻终止GitHub Actions步骤,标记作业为失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:18:10