Pay*_*ian 8 docker docker-compose
如何检查服务是否docker-compose up启动成功?
上下文:我将 CI 添加到我的项目中,作为其中的一部分,我想让我的 CI 构建 docker 映像并执行docker-compose命令以查看是否可以在进入下一阶段之前成功启动所有服务CI的。
我在想我应该做些什么来达到以下效果:
$ docker build -t myimage 。 $ docker-compose up -d # 尝试对状态为“退出”的图像进行计数,如果大于 1,则返回 1 # 如果图像名称包含子字符串“Exit”但运行正常,会发生什么? $ if [[ $(docker-compose -f docker-compose-local.yml ps | grep "退出" | wc -l) -ne 0 ]]; 然后返回1;菲
我怀疑通过ps子命令查找容器的状态不是很好,并且有更好的解决方案。我找过,但没有找到。
docker 容器有哪些可能的状态?该码头工人码头没有提到可能的状态。
您也许可以尝试使用自定义HEALTHCHECK命令运行,该命令可以将状态写入临时文件或其他内容,CI 进程可以检查该状态,然后终止容器。
HEALTHCHECK还将导致每个容器的健康状态存储health_status在 的输出中的相应字段中docker inspect,这对您来说可能比docker ps.
更一般地说,我曾在一些应用程序中工作过,在这些应用程序中我们创建了一种我们称之为“冒烟测试”的测试——与完全验收测试非常相似,除了它仍然可以使用某些类型的人工或夹具数据。但是对 Web / 容器应用程序的实际请求是真实的。
然后你要做的是有一个脚本来启动你的容器集,然后针对这些容器支持的任何应用程序(例如数据库查询、http 请求等)执行测试套件。
通常,您可以为此重用您选择的语言中的单元测试框架。就我而言,我们曾经pytest编写一些基于 Python 的烟雾测试……启动所有容器,然后使用各种已知正确响应的人工请求来攻击它们。如果 Python 测试过程成功退出,则整体测试通过,并且会关闭容器。
我喜欢这种方法,因为这样“检查所有 docker-compose up 服务是否成功启动”的定义就像其他任何东西一样变成了一些自动化测试,并且它被签入了某个地方的源代码。如果应用程序发生变化,您相应地更改测试,否则它们会导致构建失败。
然而,如果您使用简单的HEALTHCHECK命令,则可能会获得虚假信息。也许容器似乎启动并运行,但是如果某个数据资源或远程连接等在启动时没有成功,除非您HEALTHCHECK明确涉及验证它,否则您将不知道。
实际上,仅仅知道容器已启动并正在运行很少重要。相反,通常重要的是一些“真实”测试套件,这些测试会影响正在运行的容器,并证明在真实用例场景中运行所需的一切实际上都在正常工作。
如何检查所有 docker-compose up 服务是否启动成功?
您可以通过比较所有正在运行的服务和所有服务来检查 docker-compose 中的所有服务是否正在运行。请注意,这可能并不意味着您的服务正在运行 - 仅意味着 docker 容器正在运行。以下 shell 脚本仅比较正在运行的服务和所有服务的计数:
running="$(docker-compose ps --services --filter "status=running")"
services="$(docker-compose ps --services)"
if [ "$running" != "$services" ]; then
echo "Following services are not running:"
# Bash specific
comm -13 <(sort <<<"$running") <(sort <<<"$services")
else
echo "All services are running"
fi
Run Code Online (Sandbox Code Playgroud)
看来在docker中否定过滤器是不可能的,所以它必须是这样的。
| 归档时间: |
|
| 查看次数: |
3313 次 |
| 最近记录: |