在bash 中,您可以通过$? 获取上一条命令的退出代码。例如:
bash -c "exit 12"; echo $?
将打印 12。
在您的情况下,您可以将退出代码保存到变量中,但是,由于 Dockerfile 的特殊性,在获取它们时可能会出现一些问题(您不能将它们导出到环境变量中以便在下一个 RUN 中使用)。根据您想如何使用它,例如,您可以将其写入文本文件,或在该脚本中执行某些操作:
RUN bash -c " \
if [ \"$FLAVOR\" = E2ETEST ] ; then \
./gradlew clean :app:testDevDebugUnitTest --tests abcTest; EX1=\"\$?\"; \
./gradlew clean :app:testDevDebugUnitTest --tests cdeTest -PtestType=\"e2e\" executeE2ETests; EX2=\"\$?\"; \
./gradlew clean :app:testDevDebugUnitTest --tests defTest; EX3=\"\$?\"; \
echo \$EX1 \$EX2 \$EX3" > /tmp/exit_codes; \
fi"
另外,$FLAVOR 最好用括号括起来,因为如果 $FLAVOR 为空会产生错误。
$ 被转义,因为 docker 在解析过程中扩展了表达式。
如果您只需要检查命令是否成功,只需将; 替换为&&(如果任何命令以非零退出代码退出,则以下RUN 将失败):
RUN bash -c " \
if [ \"$FLAVOR\" = E2ETEST ] ; then \
./gradlew clean :app:testDevDebugUnitTest --tests abcTest && \
./gradlew clean :app:testDevDebugUnitTest --tests cdeTest -PtestType=\"e2e\" executeE2ETests && \
./gradlew clean :app:testDevDebugUnitTest --tests defTest; \
fi"
运行所有命令并在其中任何一个失败时获取退出代码 1
RUN bash -c " \
if [ \"$FLAVOR\" = E2ETEST ] ; then \
./gradlew clean :app:testDevDebugUnitTest --tests abcTest; EX1=\"\$?\"; \
./gradlew clean :app:testDevDebugUnitTest --tests cdeTest -PtestType=\"e2e\" executeE2ETests; EX2=\"\$?\"; \
./gradlew clean :app:testDevDebugUnitTest --tests defTest; EX3=\"\$?\"; \
if [ $EX1 == 0 ] && [ $EX2 == 0 ] && [ $EX3 == 0 ]; then exit 0; else exit 1; fi; \
fi"