为什么发生错误时 docker-compose 会发出“错误”的退出代码?

为什么发生错误时 docker-compose 会发出“错误”的退出代码?

我创建了一个 bash 脚本来自动执行正在运行的 docker 容器的 borg 备份。在启动备份之前,应暂停容器。只有在成功暂停容器后才应执行该脚本。

但现在我收到一个错误,提示容器无法暂停。但是,docker-compose 发出退出代码 0,并且脚本继续运行。

以下是我的脚本的片段:

echo "Pausing container ..."
docker-compose \
  --file [...] \
  --project-directory [...] \
  pause
docker_exit=$?

## don't start backup if container isn't paused
if [ ${docker_exit} -eq 0 ]; then
    echo "... container paused successfully"
elif [ ${docker_exit} -eq 1 ]; then
    echo "... container not paused with warnings"
    echo "Logfile for backup script: ${log}"
    exit ${docker_exit}
else
    echo "... container not paused with errors"
    echo "Logfile for backup script: ${log}"
    exit ${docker_exit}
fi

当通过 cron 执行脚本时,我在日志文件中得到以下输出:

Pausing container ...
Pausing [...] ...
^[[1A^[[2K^MPausing [...] ... ^[[31merror^[[0m^M^[[1B
ERROR: for [...]  Cannot pause container [...]: OCI runtime pause failed: unable to freeze: unknown
... container paused successfully

我已经尝试在官方 docker 文档中寻找提示,但最终只找到https://docs.docker.com/engine/reference/commandline/compose_up/#options我发现 docker-compose 选项“--exit-code-from”不是正确的解决方案。

所以也许有人看到了我的错误并能帮助我?非常感谢!

PS 如果有些内容不太理解或者缺少一些细节我会在收到提示后进行添加 :)

答案1

这看起来很奇怪。我认为docker-compose应该是从底层 docker cli 传递退出代码,所以这要么是一个错误,要么问题更深。如果我没记错的话,“堆栈”是docker-compose-> docker->cgroup freezer

我建议在单个容器上使用 cli(不使用 compose)测试运行脚本,docker以获取退出代码。如果退出代码正确(=不总是 0),那么很可能是 中的一个错误docker-compose

另一个选择是找出暂停失败的原因 :) 脚本是否仅从 crontab 运行时才这样运行?docker-compose 是否有公开可用的东西,以便我可以重现它?

相关内容