Linux bash脚本无法正确捕获退出代码1

Linux bash脚本无法正确捕获退出代码1,linux,bash,docker-compose,Linux,Bash,Docker Compose,我有一个bash脚本,其中我启动了一个docker。由于存在一些错误,docker启动失败,并且它清楚地表示退出代码1。这是我必须运行docker命令的脚本 startContainer(){ echo "change directory to ..." cd "..." docker-compose -f ./docker-compose.yml up -d if [[ $? -eq 0 ]]; then echo "Executed docker-compos

我有一个bash脚本,其中我启动了一个docker。由于存在一些错误,docker启动失败,并且它清楚地表示退出代码1。这是我必须运行docker命令的脚本

startContainer(){

  echo "change directory to ..."
  cd "..."

  docker-compose -f ./docker-compose.yml up -d
  if [[ $? -eq 0 ]]; then
      echo "Executed docker-compose successfully on ${HOST_APP_HOME}"
  else
    echo "Failed to start container on ${HOST_APP_HOME}. Failed command:  docker-compose -f ${DOCKER_CONF_FILE} up -d"
    printErrorFinish
  fi
}
docker compose
命令失败,并清晰地打印此消息

 exited with code 1

但是我的脚本没有捕获它,第一个条件(-eq 0)被执行。为什么它不能捕获这个错误并认为它是一个成功的命令? 我认为docker compose的状态代码本身没有意义。它负责运行多个其他容器,您看到的exist状态可能来自其中一个容器。 根据docker compose文件的功能,您可以使用
--exit code from
选项获取每个服务的退出代码。您还可以为所需的服务添加运行状况检查机制,以便知道哪个正在运行,哪个没有(成功部署的服务不会返回任何值,但可以通过运行状况检查进行检查)

您可以从中阅读--退出代码


很抱歉,我不知道更好的方法。

您知道吗,退出状态为1的是docker compose本身,而不是其子流程之一?(要明确的是,上面的内容是修辞性的;我断言你没有)。我要做的第一件事是停止使用
$?
;如果docker-compose-f./docker-compose.yml up-d;然后,这样就不可能有调试陷阱或其他事情在你背后发生,从而在捕获之前改变退出状态。但更可能的是,错误消息来自更深的层,并且没有被中继回来,因此我要经过的地方是使用
sysdig
跟踪所有涉及的单个进程以及每个进程的退出状态(并查看到底是哪个进程写入了“exited with code 1”消息)。(…这一点,以及该进程是否实际以状态1退出;如果确实存在,其父进程是谁,以及该父进程是否实际以状态1退出,等等,直到将控制返回到shell脚本)。我如何找出错误代码1来自docker compose命令或其他进程?因为您正在执行
if
块,它显然来自其他内容。可能是某个
docker compose
在内部执行。它与-d选项兼容吗?@HHH我提到的选项,没有,但在执行后会进行健康检查有一段时间了