在分离之前等待Docker容器健康检查成功

4
在docker-py中,是否有一种方法可以在容器分离之前等待健康检查成功呢?我正在尝试以下操作,但问题是.run()在健康检查成功之前就返回了。如果我在run()之后尝试curl 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'})
1个回答

9

这似乎完全没有文件记录,但是通过在源代码中研究,我想出了一种在继续之前等待健康检查通过的方法。

由于这与您正在进行健康检查的图像无关,因此我使用了我熟悉的图像,该图像具有自己的健康检查工具。这种方法也适用于其他图像和健康检查方法。

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 版本。 因此,我们限制了少量基本属性的快速访问。 从这一点来看,我个人不同意将健康属性视为基本属性; 大多数容器根本不使用健康检查。


顺便说一句,如果有人觉得重构这个解决方案可以让它更好,请随意去做! - LondonRob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接