20

Recently, we had an outage due to Redis being unable to write to a file system (not sure why it's Amazon EFS) anyway I noted that there was no actual HEALTHCHECK set up for the Docker service to make sure it is running correctly, Redis is up so I can't simply use nc -z to check if the port is open.

Is there a command I can execute in the redis:6-alpine (or non-alpine) image that I can put in the healthcheck block of the docker-compose.yml file.

Note I am looking for command that is available internally in the image. Not an external healthcheck.

Archimedes Trajano
  • 28,830
  • 14
  • 134
  • 195

4 Answers4

22

If I remember correctly that image includes redis-cli so, maybe, something along these lines:

...
healthcheck:
   test: ["CMD", "redis-cli","ping"]
nitrin0
  • 572
  • 2
  • 9
8

Although the ping operation from @nitrin0 answer generally works. It does not handle the case where the write operation will actually fail. So instead I perform a change that will just increment a value to a key I don't plan to use.

image: redis:6
healthcheck:
  test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ]
Archimedes Trajano
  • 28,830
  • 14
  • 134
  • 195
5

I've just noticed that there is a phase in which redis is still starting up and loading data. In this phase, redis-cli ping shows the error

LOADING Redis is loading the dataset in memory

but stills returns the exit code 0, which would make redis already report has healthy.

Also redis-cli --raw incr ping returns 0 in this phase without actually incrementing this key successfully.

As a workaround, I'm checking whether the redis-cli ping actually prints a PONG, which it only does after the LOADING has been finished.

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

This works because grep returns only 0 when the string ("PONG") is found.

fiedl
  • 5,042
  • 4
  • 36
  • 54
3

You can also add it inside the Dockerfile if your using a Redis image that contains the redis-cli:

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 }