在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'})
答案 0 :(得分:1)
这似乎是完全没有记录的,但是通过探究源代码,我想出了一种方法,可以等待运行状况检查通过之后再继续操作。
由于这实际上与要进行健康检查的图像无关,因此我使用了我很熟悉的图像,它具有自己的健康检查工具。此方法也适用于其他图像和运行状况检查方法。
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问题跟踪器中找到了this comment,它说:
这个想法是为了避免泛滥的属性,这些属性又需要维护,并且可能出现在属性字典的不同位置,具体取决于API版本。结果,我们将快速访问属性的数量限制为几个基本要素。就这一点而言,我个人不同意健康属性必不可少的观点。大多数容器根本不使用运行状况检查。