如何在 Redis Docker 镜像中执行 HEALTHCHECK?

Arc*_*ano 4 redis docker docker-swarm

最近,由于 Redis 无法写入文件系统(不知道为什么是 Amazon EFS),我们发生了中断,无论如何我注意到没有为 Docker 服务设置实际的 HEALTHCHECK 以确保它正常运行,Redis 是up 所以我不能简单地nc -z用来检查端口是否打开。

是否有我可以在redis:6-alpine(或非高山)图像中执行的命令,我可以将其放入文件healthcheck块中docker-compose.yml

注意我正在寻找内部可用的命令在图像。不是外部健康检查

Arc*_*ano 50

尽管ping@nitrin0 答案的操作通常有效。它不处理写操作实际上失败的情况。因此,我执行了一项更改,仅将值增加到我不打算使用的键。

image: redis:6
healthcheck:
  test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ]
Run Code Online (Sandbox Code Playgroud)

  • 如果你有redis的密码,可以使用: test: [ "CMD", "redis-cli", "-a", "password", "--raw", "incr", "ping" ] (3认同)

fie*_*edl 35

我刚刚注意到,有一个阶段,redis 仍在启动并加载数据。在此阶段,redis-cli ping显示错误

LOADING Redis is loading the dataset in memory
Run Code Online (Sandbox Code Playgroud)

但仍然返回退出代码0,这将使redis已经报告健康。

也会在此阶段redis-cli --raw incr ping返回0,但实际上并未成功增加此密钥。

作为解决方法,我正在检查是否redis-cli ping实际打印 a PONG,它仅在加载完成后才执行。

LOADING Redis is loading the dataset in memory
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为仅当找到字符串(“PONG”)时才grep返回。0

  • `[ "$(redis-cli ping)" = "PONG" ]` 精确匹配 (2认同)

小智 6

如果我没记错的话,该图像redis-cli可能包含以下内容:

...
healthcheck:
   test: ["CMD", "redis-cli","ping"]
Run Code Online (Sandbox Code Playgroud)