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