docker-laravel/scripts/container-health

41 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# ===========================================================================
# container-health — Docker HEALTHCHECK for the docker-laravel image.
#
# Asserts that every supervisor program that is SUPPOSED to be running (the
# core web stack, plus whichever ENABLE_* services are on) is actually in the
# RUNNING state. If a queue worker or scheduler has crashed and supervisor gave
# up (FATAL), or never started, the container is reported UNHEALTHY — so a dead
# worker is visible in `docker ps` / orchestration instead of silently letting
# jobs pile up.
#
# Exit 0 = healthy, 1 = unhealthy. Used by HEALTHCHECK in the Dockerfile.
# ===========================================================================
set -uo pipefail
# Programs that must always be up.
expected=(php-fpm nginx)
# Optional services, gated by the same env vars start-container reads.
[ "${ENABLE_QUEUE:-false}" = "true" ] && expected+=(queue)
[ "${ENABLE_SCHEDULER:-false}" = "true" ] && expected+=(scheduler)
[ "${ENABLE_HORIZON:-false}" = "true" ] && expected+=(horizon)
status="$(supervisorctl status 2>/dev/null)"
if [ -z "$status" ]; then
echo "UNHEALTHY: supervisorctl returned no status (supervisord down?)"
exit 1
fi
rc=0
for p in "${expected[@]}"; do
# supervisorctl prints e.g. "queue RUNNING pid 123, uptime 0:10:00"
if ! echo "$status" | grep -qE "^${p}([:_][^ ]*)?[[:space:]]+RUNNING"; then
line="$(echo "$status" | grep -E "^${p}([:_][^ ]*)?[[:space:]]" || echo "${p} (missing)")"
echo "UNHEALTHY: '${p}' is not RUNNING -> ${line}"
rc=1
fi
done
exit $rc