如何检测docker是否以编程方式运行成功?

时间:2014-07-03 03:04:15

标签: bash docker

我正在编写一个非常简单的bash脚本来快速检查我的容器是否仍然正确构建和启动,并且内部的应用程序响应请求。

有时docker run失败,例如因为我正在尝试绑定容器的端口已经分配。但是当发生这种情况时docker run的退出代码仍为0,所以我无法使用退出代码。如何以编程方式检查容器是否正确启动?

我正在考虑的解决方案是:

  • 解析输出错误
  • docker ps查看容器是否正在运行

但这些看起来都有点矫枉过正丑陋。我错过了检查docker run是否成功的更好方法吗?

5 个答案:

答案 0 :(得分:111)

正如AbelMuiño在评论中所建议的那样,这可能已在最近的Docker版本中得到修复(我目前正在运行0.9.1)。

但是,如果你像我一样暂时使用旧版本,我确实找到了一个不错的解决方法来检查容器是否使用docker inspect启动。

docker inspect返回一个JSON对象,其中包含大量有关容器的信息,特别是容器当前是否正在运行。 -f标志可让您轻松提取所需的位:

docker inspect -f {{.State.Running}} $CONTAINER_ID

docker inspect -f "{{.State.Running}}" $CONTAINER_ID

将返回truefalse

请注意,您可能希望在启动容器和检查容器是否已启动之间sleep 1(或更多)。如果您的设置出现问题,可能会在实际退出之前在很短的时间内显示为“正在运行”。

答案 1 :(得分:20)

为避免解析任何内容,您可以使用 docker top ,如果容器未运行,则返回1:

id=$(docker run mycontainer)
if ! docker top $id &>/dev/null
then
    echo "Container crashed unexpectedly..."
    return 1
fi

答案 2 :(得分:9)

我们可以使用docker exec $id true 2>/dev/null || echo not running

此命令不会写入stdout,因为" docker top"确实。它在容器未运行时写入stderr,与" docker top"相同的消息。

答案 3 :(得分:1)

我必须使用:

$ docker inspect -f {{.State.Health.Status}} xxx

(容器处于运行状态,但容器内的服务尚未完全启动。

检查输出的一部分:

"State": {
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 1618,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2019-03-08T10:39:24.061732398Z",
    "FinishedAt": "0001-01-01T00:00:00Z",
    "Health": {
        "Status": "starting",
        "FailingStreak": 0,
        "Log": []

答案 4 :(得分:0)

将上述建议应用于脚本。

1-创建脚本 keepMyDockerUp.sh

vi keepMyDockerUp.sh


#!/bin/bash
Container_ID=INSERT_YOUR_CONTAINER_ID HERE
result=$( docker inspect -f {{.State.Running}} $Container_ID)
echo "result is" $result
if [ $result = "true" ]
then
echo "docker is already running"
else
systemctl restart docker
docker start $Container_ID
fi

2-然后只需将其添加到cron中,以便您的脚本验证Docker容器是否不时启动:

crontab -e

转到最后一行并添加脚本文件。例如:

* * * * * /root/keepMyDockerUp.sh

3-保存crontab,不必担心Docker容器再次宕机。

希望有帮助...

;-)