如何检测docker运行成功编程?
我正在编写一个非常简单的bash脚本来快速检查我的容器是否仍然正确构build并正确启动,并且里面的应用程序响应请求。
有时docker run
失败,例如,因为我试图绑定容器的端口已被分配。 但是,当发生这种情况docker run
的退出代码仍然是0,所以我不能使用退出代码。 我怎样才能以编程方式检查容器是否正确启动?
我正在考虑的解决scheme是:
- parsing输出的错误
-
docker ps
来查看容器是否在运行
但这些都看起来有点矫枉过正和丑陋。 我错过了一个更好的方法来检查docker run
是否成功?
如AbelMuiño在评论中所build议的,这可能已经在更新的Docker版本中得到修复(我目前正在运行0.9.1)。
但是,如果你暂时与旧版本一样卡住,我确实find了一个体面的解决方法来检查容器是否使用docker inspect
。
docker inspect
返回一个JSON对象,其中包含许多关于容器的信息,尤其是容器当前是否正在运行。 -f
标志可让您轻松提取所需的位:
docker inspect -f {{.State.Running}} $CONTAINER_ID
将返回true
或false
。
请注意,您可能想要在启动容器和检查容器之间sleep 1
(或更多)。 如果您的设置有问题,可能会在实际退出之前显示为“运行”很短的时间。
为了避免parsing任何东西,你可以使用docker top ,如果容器没有运行,返回1。
id=$(docker run mycontainer) if ! docker top $id &>/dev/null then echo "Container crashed unexpectedly..." return 1 fi
我们可以使用docker exec $id true 2>/dev/null || echo not running
docker exec $id true 2>/dev/null || echo not running
。
这个命令不写入stdout,因为“docker top”。 当容器未运行时,它将写入stderr,与“docker top”相同。