Home > Software design >  Use wget instead of curl for healthchecks in ASP.NET Core docker images
Use wget instead of curl for healthchecks in ASP.NET Core docker images

Time:06-25

I want to use an ASP.NET Core 6 healthcheck as a docker healthcheck.

The docs state:

Containers that use images based on Alpine Linux can use the included wget in place of curl

But there is no guidance for that, and as usual getting the docker config "just right" is more of an art than a science.

How do I do this?

CodePudding user response:

It's possible to specify a healthcheck via the docker run CLI, or in a docker-compose.yml. I prefer to do it in the Dockerfile.

Configure

First note that the ASP.NET Core docker images by default expose port 80, not 5000 (so the docs linked in the question are incorrect).

This is the typical way using curl, for a non-Alpine image:

HEALTHCHECK --start-period=30s --interval=5m \
  CMD curl --fail http://localhost:80/healthz || exit 1

But curl is unavailable in an Alpine image. Instead of installing it, use wget:

HEALTHCHECK --start-period=30s --interval=5m \
  CMD wget --spider --tries=1 --no-verbose http://localhost:80/healthz || exit 1

HEALTHCHECK switches documented here.

wget switches documented here. --spider prevents the download of the page (similar to an HTTP HEAD), --tries=1 allows docker to control the retry logic, --no-verbose (instead of --quiet) ensures errors are logged by docker so you'll know what went wrong.

Test

For full status:

$ docker inspect --format '{{json .State.Health }}' MY_CONTAINER_NAME | jq

Or:

$ docker inspect --format '{{json .State.Health }}' MY_CONTAINER_NAME | jq '.Status'
# "healthy"

$ docker inspect --format '{{json .State.Health }}' MY_CONTAINER_NAME | jq '.Log[].Output'
# "Connecting to localhost:80 (127.0.0.1:80)\nremote file exists\n"
  • Related