41 lines
1.6 KiB
Plaintext
41 lines
1.6 KiB
Plaintext
|
|
#!/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
|