我正在编写一个非常简单的bash脚本,以快速检查我的容器仍在构建并正确启动,并且其中的应用程序能够响应请求。
有时会docker run
失败,例如因为我尝试将容器绑定到的端口已分配。但是当发生这种情况时docker run
,退出代码仍为0,因此我无法使用退出代码。如何以编程方式检查容器是否已正确启动?
我正在考虑的解决方案是:
- 解析输出中的错误
docker ps
查看容器是否正在运行
但是这些似乎都有些过分和丑陋。我是否缺少更好的方法来检查是否docker run
成功?
我正在编写一个非常简单的bash脚本,以快速检查我的容器仍在构建并正确启动,并且其中的应用程序能够响应请求。
有时会docker run
失败,例如因为我尝试将容器绑定到的端口已分配。但是当发生这种情况时docker run
,退出代码仍为0,因此我无法使用退出代码。如何以编程方式检查容器是否已正确启动?
我正在考虑的解决方案是:
docker ps
查看容器是否正在运行但是这些似乎都有些过分和丑陋。我是否缺少更好的方法来检查是否docker run
成功?
docker run
会在失败时返回一个非零的返回码,那么您所能做的就是解析输出(可能很复杂或脆弱)或使用另一个命令(即您的ps
建议) )检查第一个命令的结果。您可能要考虑向docker提交票证,以查看他们是否也可以修复返回码run
。
docker run -d -p 9010:9010 busybox true ; echo $?
Answers:
正如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
(或者更多)在启动容器和检查容器是否正常之间。如果您的设置有问题,则可能会在实际退出之前的很短时间内显示为“正在运行”。
docker inspect -f {{.State.Running}} <container-id>
而jq
改用?就是想。
2> /dev/null
。
2> /dev/null
因为它没有任何结果。如何将其默认设置为false
不存在的容器?
将上述建议应用于脚本。
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容器再次关闭。
希望能帮助到你...
;-)
我不得不使用:
$ 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": []