我正在编写一个非常简单的bash脚本来快速检查我的容器是否仍然正确构建和启动,并且内部的应用程序响应请求。
有时docker run
失败,例如因为我正在尝试绑定容器的端口已经分配。但是当发生这种情况时docker run
的退出代码仍为0,所以我无法使用退出代码。如何以编程方式检查容器是否正确启动?
我正在考虑的解决方案是:
docker ps
查看容器是否正在运行但这些看起来都有点矫枉过正丑陋。我错过了检查docker run
是否成功的更好方法吗?
答案 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
将返回true
或false
。
请注意,您可能希望在启动容器和检查容器是否已启动之间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容器再次宕机。
希望有帮助...
;-)