"Mein Docker, mein Docker"

Kennt Ihr das?
Nehmen wir als erstes an, dass wir einen kleinen Server zuhause in der Ecke stehen haben, der nur stundenweise am Tag läuft um kleinere und größere Aufgaben zu erledigen und uns beispielsweise ein MediaCenter zur Verfügung stellt. Ahoi "Jellyfin" an dieser Stelle.

Und da hat man sich einen so richtig schönen Docker-Stack zusammen gebaut mit allem drum und dran und dann kommt es vor, dass gerade nach dem Aufwachen vom Server einige Docker-Container nicht oder nur so semi gut laufen (unhealthy).

Dann muss man sich also irgendwie per Shell oder Portainer verbinden und die Dienste dann entweder manuell neu starten oder eben gleich einmal ein "systemctl restart docker" (oder was vergleichbares) in die Shell drömeln.

Ich war es leid und habe mir überlegt, wie ich das angehen kann... und kam - als alter Freund des Bash-Scripts - auf die Idee das wie folgt zu lösen:

#!/bin/bash

# Pfad zu deinem Verzeichnis, das die MediaDownloader.yml enthält
# <-- BITTE ANPASSEN! Ersetze "/pfad/zu/deinem/docker-compose-verzeichnis" durch den tatsächlichen Pfad!
COMPOSE_DIR="/data/compose/MediaDownloader"

# Der Name deiner Compose-Datei
COMPOSE_FILE="MediaDownloader.yml" # <-- Der Name deiner Datei

# Warte einen Moment nach dem Aufwachen
sleep 10

echo "Checking and starting Docker services defined in $COMPOSE_FILE in $COMPOSE_DIR after resume..." | systemd-cat -p info

# Wechsel in das Verzeichnis
cd "$COMPOSE_DIR"

if [ $? -ne 0 ]; then
  echo "ERROR: Could not change to compose directory $COMPOSE_DIR." | systemd-cat -p error
  exit 1
fi

# Starte/stelle sicher, dass die Services laufen,
# und gib dabei explizit den Dateinamen an mit -f
docker compose -f "$COMPOSE_FILE" up -d --remove-orphans

if [ $? -ne 0 ]; then
  echo "ERROR: 'docker compose up -d' with file $COMPOSE_FILE failed." | systemd-cat -p error
else
  echo "Docker services in $COMPOSE_FILE started successfully (or were already running)." | systemd-cat -p info
fi

exit 0

Nun nur noch unter beispielsweise "dockercheck.sh" speichern, mit "chmod -x dockercheck.sh" ausführbar machen und schon haben wir ein feines Script, das uns helfen wird.

Nun dachte ich... hey, das die Container nicht wollen, passiert ja nur wenn der olle Server aus seinem Tiefschlaf erwacht. Da hab ich mal in einem anderen Projekt schon mal was gemacht und dann das folgende Script einfach unter "/usr/lib/systemd/system-sleep/docker-compose-uffwache" (ja, ohne .sh!!) gespeichert.

#!/bin/bash
# Script placed in /usr/lib/systemd/system-sleep/ to run after resume

# This script is called by systemd-suspend.service and systemd-hibernate.service
# Arguments:
# $1 - path to the command being run (usually 'suspend' or 'hibernate')
# $2 - action ('pre' or 'post')

# Check if the action is 'post' (meaning after resume)
if [ "$2" = "post" ]; then
    # Check if the system resumed from suspend or hibernate
    if [ "$1" = "suspend" ] || [ "$1" = "hibernate" ]; then
        echo "System resumed from $1. Attempting to ensure Docker Compose services are running..." | systemd-cat -p info    # --- WICHTIG: Passe den Pf>    # Rufe nun das zuvor erstellte check_and_start_docker.sh Skript auf.
    # Wir führen es im Hintergrund aus (&), damit dieser Hook schnell fertig ist.
    /root/dockercheck.sh &  ## Hier UNBEDINGT den richtigen Pfad eintragen

    # Wir fügen hier keine zusätzliche Wartezeit ein, da die
    # check_and_start_docker.sh Skript selbst schon eine sleep-Zeit hat.

fi
fi

exit 0

Auch hier nur noch ausführbar machen mit "chmod +x /usr/lib/systemd/system-sleep/docker-compose-uffwache" und schon haben wir ein tolles kleines Tool, was uns sicher durch den nächsten Start des Servers bringt.

Menschen wie ich, der den Maschinen nur bedingt vertrauen entgegen bringt, kann das erste Script auch einfach zusätzlich noch als Contab alle halbe Stunde oder was weiß ich wie oft auch immer, laufen lassen.

Fertig!

Read more