【问题标题】:bash script does not capture exit code 1 properlybash 脚本未正确捕获退出代码 1
【发布时间】:2020-03-13 23:51:42
【问题描述】:

我有一个启动 docker 的 bash 脚本。由于那里存在一些错误,docker start 失败,它清楚地显示exit code 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) 被执行。为什么它无法捕获此错误并将其视为成功命令?

【问题讨论】:

  • 您知道以状态 1 退出的是 docker-compose 本身,而不是它的子进程之一吗? (要清楚,以上是修辞;我断言你没有)。
  • 我要做的第一件事就是停止使用$?;将您的代码编写为if docker-compose -f ./docker-compose.yml up -d; then 更加健壮,这样就不可能在您的背后发生调试陷阱或其他事情,从而在退出状态被捕获之前更改它。但是错误消息更有可能来自更深层并且没有被转发回来,所以我要过去的地方是使用sysdig 来跟踪所有涉及的单个进程以及每个进程的退出状态(和看看是哪个进程写了​​“exited with code 1”消息)。
  • (...那个,以及该进程是否实际上以状态1退出;如果确实如此,它的父级是谁以及该父级是否实际以状态1退出,等等,直到控制权返回给 shell 脚本)。
  • 如何找出错误代码 1 来自 docker-compose 命令或其他进程的位置?
  • 由于您正在执行if 块,它显然来自其他东西。大概是docker-compose 内部执行的东西。

标签: linux bash docker-compose


【解决方案1】:

我认为 docker-compose 的状态码本身并没有什么意义。它负责运行多个其他容器,您看到打印的存在状态可能来自其中一个容器。 根据您的 docker-compose 文件正在做什么,您可以使用 --exit-code-from 选项来获取每个服务的退出代码。您还可以为所需服务添加健康检查机制,以了解哪个正在运行,哪个未运行(成功部署的服务不会返回任何值,但可以通过健康检查进行检查)。

您可以阅读关于 --exit-code-from here 的信息。

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

【讨论】:

  • 兼容 -d 选项吗?
  • @HHH 我提到的选项,没有,但是过一段时间健康检查是
猜你喜欢
  • 2011-07-15
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多