Простая реализация сторожа состояния docker-контейнеров с использованием bash, systemd и docker events.
/usr/sbin/docker-healthkeeper
#!/bin/bash
docker events -f 'type=container' -f 'event=health_status' --format '{{.ID}}|{{.Action}}' | while read -r EVENT; do
if [ "${EVENT#*|}" == 'health_status: unhealthy' ]; then
echo -n 'restart container id='
docker restart "${EVENT%|*}"
fi
done
echo 'close docker socket'
/lib/systemd/system/docker-healthkeeper.service
[Unit]
Description=HealthKeeper for docker daemon
ConditionPathExists=/usr/bin/docker
After=docker.service
Requires=docker.service
Wants=docker.service
[Service]
Type=simple
ExecStart=/usr/sbin/docker-healthkeeper
Restart=always
RestartSec=1
[Install]
WantedBy=docker.service
Выше приведённый скрипт отслеживает события изменения состояния healthcheck контейнеров и немедленно перезапускает контейнеры, перешедшие из состояния healthy в failure с соответствующей записью в лог journald
Внимание: поддержка событий в докере появилась с версии 1.4.0 (декабрь 2014), по этому более ранние версии пробовать не имеет смысла.