当 docker run 命令在将输出通过管道传输到文件和 CLI 时失败时,如何在 github-actions shell 中获取错误代码

问题描述 投票:0回答:1

我正在尝试捕获 GitHub Actions 中 Docker 命令的输出和错误状态。即使 Docker 内的命令失败,我也会得到成功的退出代码。这是我当前的工作流程:

name: Test Docker Command

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Run test
        run: |
          docker run tensorpod/pymimic3:latest \
            bash -ic "pytest tests/test_metrics" 2>&1 | tee output.txt
          
          echo "Pipe status: ${PIPESTATUS[0]}"
          echo "Exit status: $?"
          
          if [ $? -ne 0 ]; then
            echo "The command failed."
            exit 1
          fi

${PIPESTATUS[0]} 和 $?即使 Docker 内的 pytest 命令失败,也会返回 0(成功)。我知道 GitHub Actions 默认使用带有 set -eo pipelinefail 的 bash,但它仍然没有捕获失败。 问题: 如何正确捕获和处理 Docker 命令的退出状态,同时仍将其输出传输到文件和控制台? 附加信息:

我需要捕获 stdout 和 stderr (2>&1) 我需要在 GitHub Actions 日志中实时查看输出 我需要将输出保存到文件中 如果 Docker 内的命令失败,我需要失败的步骤

你能帮助我了解我做错了什么以及如何解决它吗?

docker shell github-actions pipe workflow
1个回答
0
投票

如何正确捕获和处理 Docker 命令的退出状态,同时仍将其输出传输到文件和控制台?

潜在的问题可能是,当使用

pipe (|)
将一个命令的输出发送到另一个命令时,
$?
只捕获管道中最后一个命令的退出代码,而不是原始 Docker 的退出代码命令。

docker run tensorpod/pymimic3:latest \
        bash -ic "pytest tests/test_metrics" 2>&1 | tee output.txt

您可以尝试捕获 Docker 命令的正确退出代码,同时仍将其输出传输到文件和控制台

name: Test Docker Command

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Run test
        run: |
          docker_output=$(docker run tensorpod/pymimic3:latest \
              bash -ic "pytest tests/test_metrics" 2>&1)

          docker_exit_code=$?
          echo "$docker_output" | tee output.txt
      
          echo "Pipe status: ${PIPESTATUS[0]}"
          echo "Exit status: $docker_exit_code"

          if [ $docker_exit_code -ne 0 ]; then
            echo "The command inside Docker failed."
            exit 1
          fi
© www.soinside.com 2019 - 2024. All rights reserved.