python - 等待 docker 容器运行状况检查成功后再分离
问题描述
docker-py 中有没有办法在分离容器之前等待运行状况检查成功?我正在尝试执行以下操作,但问题是 .run() 在运行状况检查成功之前返回。如果我尝试在 run() 之后卷曲 elasticsearch 端点,则调用失败。
cls.es = client.containers.run("elasticsearch:7.5.0", auto_remove=True,
detach=True, publish_all_ports=True,
healthcheck='curl localhost:9200/_cat/health',
ports={'9200/tcp': 9200},
environment={'discovery.type': 'single-node'})
解决方案
这似乎完全没有文档记录,但是通过查看源代码,我想出了一种方法,可以在继续之前等待运行状况检查通过。
由于这与您正在检查的图像无关,因此我使用了我熟悉的图像,它有自己的健康检查工具。此方法也适用于其他图像和健康检查方法。
from time import sleep
from docker import APIClient
from docker.models.containers import Container
import docker
def get_health(container: Container):
api_client = APIClient()
inspect_results = api_client.inspect_container(container.name)
return inspect_results['State']['Health']['Status']
client = docker.from_env()
container = client.containers.run(
'postgres:12',
environment={'POSTGRES_HOST_AUTH_METHOD': 'trust'},
detach=True,
remove=True,
healthcheck={'test': ['CMD', 'pg_isready', '-U', 'postgres'], 'interval': 100000000},
)
while get_health(container) != 'healthy':
print(get_health(container))
sleep(0.1)
print('Container is healthy')
免责声明:
- 这里没有超时,所以如果健康检查失败,这个过程将永远等待
- 由于这完全没有记录,我认为这不是正确的方法是有原因的。我很想知道是否有任何贡献者
py-docker
知道此功能发生了什么。
来自贡献者的更新
我在 Github 问题跟踪器中找到了这条评论,上面写着:
这个想法是为了避免属性的扩散,而这些属性又需要维护,并且可能出现在属性字典中的不同位置,具体取决于 API 版本。因此,我们将快速访问属性的数量限制为几个基本要素。就这一点而言,我个人不同意健康属性至关重要的观点。大多数容器根本不使用健康检查。
推荐阅读
- python-3.x - 为什么'del'在不同的情况下工作方式不同?请指导
- ansible - 没有找到预期
- django - Django 'FloatField' 不可调用
- laravel - 如何在 Laravel 中使用 GET 请求注销
- node.js - 尝试使用 AWS Lambda 和 Mailgun 发送交易电子邮件时的奇怪行为
- openbravo - Openbravo:不能
- stenciljs - Stencil dev 构建样式问题
- kali-linux - 如何卸载使用 dpkg 安装的软件包
- bash - 具有无限循环的 Linux bashscript 在一段时间后停止工作
- python - 如何清除循环内运行的池使用的内存?