如何在Redis Docker映像中执行HEALTHCHECK



最近,由于Redis无法写入文件系统(不确定为什么是Amazon EFS(,我们发生了故障。无论如何,我注意到Docker服务没有实际设置HEALTHCHECK以确保其正确运行,Redis已经启动,所以我不能简单地使用nc -z来检查端口是否打开。

有没有一个命令我可以在redis:6-alpine(或非高山(映像中执行,我可以把它放在docker-compose.yml文件的healthcheck块中。

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

如果我没记错的话,那个图像包括redis-cli,所以,也许,沿着这些线的东西:

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

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

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

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

LOADING Redis is loading the dataset in memory

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

此外,redis-cli --raw incr ping在该阶段返回0,而实际上没有成功地递增该密钥。

作为一种变通方法,我正在检查redis-cli ping是否真的打印了PONG,只有在LOADING完成后才会打印。

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

这是因为当找到字符串("PONG"(时grep仅返回0

如果您使用包含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 }

最新更新