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

问题描述 投票:0回答:4

最近,由于 Redis 无法写入文件系统(不确定为什么是 Amazon EFS),我们发生了中断,无论如何,我注意到没有为 Docker 服务设置实际的 HEALTHCHECK 来确保其正确运行,Redis已启动,因此我不能简单地使用

nc -z
来检查端口是否打开。

是否有我可以在

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

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

docker redis docker-swarm
4个回答
53
投票

虽然来自 @nitrin0 答案的

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

image: redis:6
healthcheck:
  test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ]

请注意,这不能在由 Docker 初始化的集群上执行。由于此健康检查将阻止集群形成,因为 Redis 不为空。


43
投票

如果我没记错的话,该图像包括

redis-cli
,所以,也许,沿着这些思路:

...
healthcheck:
   test: ["CMD", "redis-cli","ping"]

35
投票

我刚刚注意到,有一个阶段,redis 仍在启动并加载数据。在此阶段,

redis-cli ping
显示错误

LOADING Redis is loading the dataset in memory

但仍然返回退出代码

0
,这将使redis已经报告健康。

此外,

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

作为解决方法,我正在检查

redis-cli ping
是否实际打印
PONG
,它仅在加载完成后才会执行。

services:
  redis:
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
      interval: 1s
      timeout: 3s
      retries: 5

这是有效的,因为当找到字符串(“PONG”)时,

grep
仅返回
0


4
投票

如果您使用包含 redis-cli 的 Redis 镜像,您也可以将其添加到 Dockerfile 中:

Linux Docker

HEALTHCHECK CMD redis-cli ping || exit 1

Windows Docker

HEALTHCHECK CMD pwsh.exe -command \
try { \
    $response = ./redis-cli ping; \
    if ($response -eq 'PONG') { return 0} else {return 1}; \
} catch { return 1 }
© www.soinside.com 2019 - 2024. All rights reserved.