我正在尝试捕获 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 命令的退出状态,同时仍将其输出传输到文件和控制台?
潜在的问题可能是,当使用
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