如何在 Redis Docker 镜像中执行 HEALTHCHECK?
How do you perform a HEALTHCHECK in the Redis Docker image?
最近,由于 Redis 无法写入文件系统(不确定为什么是 Amazon EFS),我们遇到了一次中断,无论如何我注意到没有为 Docker 服务设置实际的 HEALTHCHECK确保它 运行 正确,Redis 已启动,所以我不能简单地使用 nc -z
检查端口是否打开。
是否有我可以在 redis:6-alpine
(或非高山)图像中执行的命令,我可以将其放入 docker-compose.yml
文件的 healthcheck
块中。
请注意,我正在寻找图像中内部可用的命令。不是 external healthcheck.
如果我没记错的话,那张图片包括 redis-cli
那么,也许是这样的:
...
healthcheck:
test: ["CMD", "redis-cli","ping"]
如果您使用包含 redis-cli 的 Redis 映像,您也可以将其添加到 Docker 文件中:
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 }
尽管来自@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
但仍然 returns 退出代码 0
,这将使 redis 已经报告健康。
还有 redis-cli --raw incr ping
returns 0
在这个阶段实际上没有成功地增加这个密钥。
作为解决方法,我正在检查 redis-cli ping
是否实际打印 PONG
,它仅在加载完成后才打印。
services:
redis:
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
interval: 1s
timeout: 3s
retries: 5
这是有效的,因为 grep
returns 只有 0
当找到字符串 ("PONG") 时。
最近,由于 Redis 无法写入文件系统(不确定为什么是 Amazon EFS),我们遇到了一次中断,无论如何我注意到没有为 Docker 服务设置实际的 HEALTHCHECK确保它 运行 正确,Redis 已启动,所以我不能简单地使用 nc -z
检查端口是否打开。
是否有我可以在 redis:6-alpine
(或非高山)图像中执行的命令,我可以将其放入 docker-compose.yml
文件的 healthcheck
块中。
请注意,我正在寻找图像中内部可用的命令。不是 external healthcheck.
如果我没记错的话,那张图片包括 redis-cli
那么,也许是这样的:
...
healthcheck:
test: ["CMD", "redis-cli","ping"]
如果您使用包含 redis-cli 的 Redis 映像,您也可以将其添加到 Docker 文件中:
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 }
尽管来自@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
但仍然 returns 退出代码 0
,这将使 redis 已经报告健康。
还有 redis-cli --raw incr ping
returns 0
在这个阶段实际上没有成功地增加这个密钥。
作为解决方法,我正在检查 redis-cli ping
是否实际打印 PONG
,它仅在加载完成后才打印。
services:
redis:
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
interval: 1s
timeout: 3s
retries: 5
这是有效的,因为 grep
returns 只有 0
当找到字符串 ("PONG") 时。