Healthcheck

I am always amused on how complex K8s/Docker Swarm are, and how easy “plain” docker is.

On my humble website I use a bunch of docker containers, and I refrain to use K8s because as far as I can tell you, the effort needed to setup K8s is still huge if you have less than a dozen of services to manage and/or a easy network layout.

For instance, on my home lab I have a gitea sever which sometimes starts before its NFS disks are mounted (it is weird, but happens).
I discovered you can use a special HEALTHCHECK directive inside docker or inside docker-compose to cope with it.

The healthcheck works best with Docker Swarm, but you can self-manage it if you dare to use little “kill” command :)

Docker example:

HEALTHCHECK --interval=5s --timeout=2s CMD curl --fail http://localhost || kill 1

Docker-compose example:

version: "3.4"
networks:
  gitea:
    external: false
services:
  server:
    image: gitea/gitea:1.17.3
    container_name: gitea
    environment:
      - USER_UID=1024
      - USER_GID=100
    restart: always
    networks:
      - gitea
    volumes:
      - /nfsgitaz:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "80:3000"
      - "22:22"
    # To debug: docker inspect --format "{{json .State.Health }}"
    # If the NFS is not mounted we kill the service and force a restart
    healthcheck:
      test: test -d /data/git/repositories || kill -9 -1
      interval: 0m20s
      timeout: 30s
      retries: 1
      start_period: 30s

Keep in mind the restart: directive is important, to be sure docker will relaunch your just self-killed container :)
Last but not least, a Stack Overflow reference

 

Last but not least, read also about an handy tool called Healthcheck.io, based on a simple yet effective way of tracing only failures