{"id":13043,"date":"2026-09-16T12:45:00","date_gmt":"2026-09-16T10:45:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13043"},"modified":"2026-10-26T12:07:07","modified_gmt":"2026-10-26T11:07:07","slug":"tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/","title":{"rendered":"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten"},"content":{"rendered":"<p>Eine Docker-Compose-Datei kann typische Betriebsrisiken verringern; wenige Einstellungen garantieren aber keinen unbeaufsichtigten Jahresbetrieb. Neustartverhalten, Zustandspr\u00fcfung, Protokollaufbewahrung, Ressourcenlimits und Image-Aktualisierung l\u00f6sen unterschiedliche Probleme. Sicherungen, \u00dcberwachung und gepr\u00fcfte Wiederherstellung bleiben eigene Anforderungen.<\/p>\n<figure class=\"lw-diagram\"><img loading=\"lazy\" decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/diagrams\/dia-13043-composehard-20261024.png\" alt=\"Vier erg\u00e4nzende Pr\u00fcfbereiche im Compose-Betrieb: Neustartverhalten, Zustandsmeldung, Ressourcenbudgets und Image-Wiederherstellung. Konfigurationspr\u00fcfung allein weist keine Wiederherstellung nach.\" width=\"1120\" height=\"580\"><figcaption>Vier erg\u00e4nzende Pr\u00fcfbereiche im Compose-Betrieb: Neustartverhalten, Zustandsmeldung, Ressourcenbudgets und Image-Wiederherstellung. Konfigurationspr\u00fcfung allein weist keine Wiederherstellung nach.<\/figcaption><\/figure>\n<h2>Ein Ausgangspunkt f\u00fcr eine dauerhaft laufende Anwendung<\/h2>\n<p>Das folgende Beispiel gilt f\u00fcr eine Linux-Docker-Engine mit aktuellem Compose. Das Anwendungsimage muss UID\/GID 1000, ein schreibgesch\u00fctztes Wurzeldateisystem und den angegebenen Health-Endpunkt unterst\u00fctzen sowie curl enthalten. UID und GID sind die numerischen Benutzer- und Gruppenkennungen f\u00fcr Dateirechte. Die Image-Referenz stammt aus APP_IMAGE und muss einen \u00fcberpr\u00fcften Digest enthalten. Die Ressourcenwerte sind Beispiele, keine Dimensionierungsempfehlung f\u00fcr jeden Raspberry Pi.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"yaml\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">YAML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-yaml\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-attr\">services<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">app<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">image<\/span>: <span class=\"cbb-string\">\"${APP_IMAGE:?verified image reference required}\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">restart<\/span>: unless-stopped\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">healthcheck<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">test<\/span>: &#91;<span class=\"cbb-string\">\"CMD\"<\/span>, <span class=\"cbb-string\">\"curl\"<\/span>, <span class=\"cbb-string\">\"-fsS\"<\/span>, <span class=\"cbb-string\">\"--max-time\"<\/span>, <span class=\"cbb-string\">\"4\"<\/span>, <span class=\"cbb-string\">\"http:\/\/localhost:8080\/health\"<\/span>&#93;\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">interval<\/span>: 30s\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">timeout<\/span>: 5s\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">retries<\/span>: <span class=\"cbb-number\">3<\/span>\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">start_period<\/span>: 60s\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">logging<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">driver<\/span>: json-file\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">options<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">max-size<\/span>: <span class=\"cbb-string\">\"10m\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">max-file<\/span>: <span class=\"cbb-string\">\"3\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">mem_limit<\/span>: 512m\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">cpus<\/span>: <span class=\"cbb-number\">1.5<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">pids_limit<\/span>: <span class=\"cbb-number\">128<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">read_only<\/span>: <span class=\"cbb-constant\">true<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">tmpfs<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> \/tmp:size=64m,mode=1777\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">security_opt<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> no-new-privileges:true\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">user<\/span>: <span class=\"cbb-string\">\"1000:1000\"<\/span><\/span><\/code><\/pre><\/figure>\n<p>Ben\u00f6tigte Datenverzeichnisse der Anwendung erfordern ausdr\u00fccklich beschreibbare Volumes oder Bind-Mounts. Ein Volume ist von Docker verwalteter Speicher. Ein Bind-Mount macht ein ausgew\u00e4hltes Verzeichnis des Hosts im Container verf\u00fcgbar. Das Beispiel enth\u00e4lt bewusst keine Datenbank und keine persistenten Anwendungsdaten. Abweichende Berechtigungen, Ports, tempor\u00e4re Verzeichnisse oder Ressourcen ben\u00f6tigen eine passende Konfiguration; blo\u00dfes \u00dcbernehmen der Einstellungen f\u00fcr ein beliebiges Image gen\u00fcgt nicht.<\/p>\n<h2>Neustart und Zustandsmeldung<\/h2>\n<p><code>unless-stopped<\/code> startet einen beendeten Container einer dauerhaft laufenden Anwendung gem\u00e4\u00df Docker-Regel neu und erh\u00e4lt einen absichtlichen Stopp \u00fcber Daemon-Neustarts hinweg. Bei <code>always<\/code> kann ein manuell angehaltener Container nach einem Daemon-Neustart zur\u00fcckkehren; das abgeschlossene Stoppkommando allein bewirkt keinen sofortigen Neustart. Der Standard <code>no<\/code> deaktiviert automatische Neustarts. Einmalige Aufgaben k\u00f6nnen berechtigt eine andere Regel ben\u00f6tigen.<\/p>\n<p>Eine Neustartregel startet einen Prozess nicht allein wegen des Status unhealthy neu. Im gew\u00f6hnlichen Compose-Betrieb erfasst ein Healthcheck den Zustand; Wiederherstellung ben\u00f6tigt ein Anwendungsende oder eine gesondert entworfene Steuerung. Wachsende Wartezeiten reduzieren die Neustartfrequenz, beseitigen aber weder Ressourcenverbrauch noch die Notwendigkeit eines Alarms.<\/p>\n<p>Das Beispiel pr\u00fcft einen anwendungsspezifischen Endpunkt im Container. Ein fehlendes curl, eine falsche URL, ausgefallene Abh\u00e4ngigkeiten oder langsame Antworten k\u00f6nnen unhealthy verursachen; der Status beweist keinen h\u00e4ngenden Prozess. Eine Bereitschaftspr\u00fcfung kann wesentliche Abh\u00e4ngigkeiten einbeziehen. Automatische Neustartentscheidungen ben\u00f6tigen jedoch eine getrennte Bewertung, damit ein gemeinsamer Datenbankausfall nicht alle Anwendungen in Neustartschleifen bringt.<\/p>\n<p><code>start_period<\/code> erlaubt Anlauffehler, ohne sofort den Fehlversuchsz\u00e4hler zu erh\u00f6hen. Eine erfolgreiche Pr\u00fcfung innerhalb dieses Zeitraums beendet dieses Schonverhalten f\u00fcr nachfolgende Fehler. Pr\u00fcfdauer und Zeitplanung beeinflussen den Ablauf ebenfalls; drei Versuche bei 30-Sekunden-Intervallen ergeben deshalb keine exakt 90-sek\u00fcndige Startfrist.<\/p>\n<p>F\u00fcr eine Datenbankabh\u00e4ngigkeit geh\u00f6rt die Bedingung <code>service_healthy<\/code> unter <code>depends_on<\/code> f\u00fcr den Dienst <code>db<\/code> in den Anwendungsdienst und ein echter Healthcheck in den Datenbankdienst. Diese Bedingung steuert den Start durch Compose. Das ist keine laufende Abh\u00e4ngigkeits\u00fcberwachung; nach einem Host-Neustart pr\u00fcft ein eigenst\u00e4ndiger Docker-Containerneustart diese Compose-Startbedingung nicht erneut. Anwendungen ben\u00f6tigen weiterhin begrenzte Wiederholungsversuche und einen erneuten Verbindungsaufbau.<\/p>\n<h2>Begrenzte Protokolle und Ressourcen<\/h2>\n<p>Dockers voreingestellter Treiber json-file rotiert ohne Konfiguration nicht. Das Beispiel h\u00e4lt je Container bis zu drei rotierte Protokolldateien mit ungef\u00e4hr 10 MB vor. Replikate vervielfachen dieses Budget; Anwendungsdateien, Volumes und andere Hostprotokolle sind nicht eingeschlossen. Weder 30 MB noch eine bestimmte Aufbewahrungsdauer passen universell. Docker empfiehlt f\u00fcr viele Installationen auch den local-Treiber mit bereits aktivierter Rotation.<\/p>\n<p>Daemonweite Vorgaben werden mit den \u00fcbrigen Einstellungen der bestehenden Daemon-Konfiguration zusammengef\u00fchrt. Nach \u00dcbernahme der neuen Vorgaben behalten bestehende Container ihre alte Protokollkonfiguration bis zur Neuerstellung. Auch journald ist m\u00f6glich, macht Protokolle allein aber nicht fl\u00fcchtig: <code>Storage=volatile<\/code> speichert neue Journaldaten unter <code>\/run\/log\/journal<\/code>; dieser Bestand geht beim Neustart verloren. Vorhandene persistente Journaldateien werden nicht automatisch gel\u00f6scht. Externe Aufbewahrung ben\u00f6tigt eine eigene Konfiguration.<\/p>\n<p><code>mem_limit<\/code>, <code>cpus<\/code> und <code>pids_limit<\/code> begrenzen verschiedene Ressourcen. Speicherdruck kann einen Prozess im Container beenden; der gesamte Container startet erst neu, wenn der Hauptprozess endet und die Neustartregel greift. Limits garantieren keinen unbeeintr\u00e4chtigten Host oder Weiterbetrieb anderer Dienste. Gemeinsame Budgets ben\u00f6tigen Reserven f\u00fcr Betriebssystem, Docker, Caches und Lastspitzen. Tmpfs h\u00e4lt tempor\u00e4re Dateien im Arbeitsspeicher und verbraucht einen Teil des Speicherbudgets. Beim Stoppen des Containers gehen diese Dateien verloren.<\/p>\n<p>F\u00fcr Raspberry Pi OS gilt keine allgemeine Aussage, dass Speichersteuerung deaktiviert w\u00e4re. Die Unterst\u00fctzung h\u00e4ngt von Kernel, cgroup-Konfiguration, Betriebssystemversion und Betriebsmodus ab. <code>docker info<\/code>, die wirksame Containerkonfiguration und ein kontrollierter Test mit einer entbehrlichen Testlast zeigen das tats\u00e4chliche Verhalten. Bootparameter ben\u00f6tigen nur dann \u00c4nderungen, wenn Dokumentation und Diagnose des installierten Systems dies erfordern. In <code>cmdline.txt<\/code> bleiben Parameter auf einer logischen Zeile: Ein Umbruch zwischen Parametern kann sp\u00e4tere Angaben ausblenden; ein normaler abschlie\u00dfender Zeilenumbruch macht das System nicht zwangsl\u00e4ufig unstartbar.<\/p>\n<h2>Image-Identit\u00e4t und Berechtigungen<\/h2>\n<p>Der Neustart eines bestehenden Containers l\u00e4dt kein neues Image. Eine Neuerstellung kann je nach Abrufregel und Cache ein neueres lokales oder heruntergeladenes Image verwenden. Ein Tag kann wechseln; ein Digest bezeichnet festen Image-Inhalt. Eine Fixierung ben\u00f6tigt deshalb einen bewussten Aktualisierungsprozess mit gepr\u00fcften Digest-\u00c4nderungen, Plattformkompatibilit\u00e4t und R\u00fcckfallplanung. Ein festes Image friert weder Volume-Inhalte noch externe Dienste oder Datenbankschemata ein.<\/p>\n<p><code>docker buildx imagetools inspect IMAGE:TAG<\/code> zeigt Registry-Metadaten. Der Digest eines Mehrplattform-Index verweist auf mehrere Plattformmanifeste; ein plattformspezifischer Manifest-Digest fixiert eine Variante. Beides kann bei bewusster Auswahl passend sein. Ein lokaler RepoDigests-Eintrag garantiert nicht allgemein einen Index-Digest; lokal gebaute Images besitzen m\u00f6glicherweise gar keinen Repository-Digest. Die ben\u00f6tigte Pi-Architektur muss tats\u00e4chlich im Index vorkommen. Fehlzuordnungen k\u00f6nnen abh\u00e4ngig von Plattformwahl und Emulation schon bei Auswahl, Erstellung oder erst beim Ausf\u00fchren scheitern.<\/p>\n<p><code>user: \"1000:1000\"<\/code> legt eine Identit\u00e4t fest; die Vertr\u00e4glichkeit h\u00e4ngt von Image-Startverhalten und Volume-Rechten ab. <code>no-new-privileges<\/code> verhindert zus\u00e4tzliche Rechte durch Mechanismen wie setuid-Programme, entfernt aber keine bereits gew\u00e4hrten Rechte und verwandelt root nicht in einen unprivilegierten Benutzer. Ein schreibgesch\u00fctztes Wurzeldateisystem l\u00e4sst ausdr\u00fccklich beschreibbare Mounts beschreibbar. Diese Ma\u00dfnahmen ben\u00f6tigen Anwendungstests statt einer Zusage, dass jede Anwendung unver\u00e4ndert weiterl\u00e4uft.<\/p>\n<h2>Konfigurationspr\u00fcfung mit ausdr\u00fccklicher Regel<\/h2>\n<p><code>docker compose config -q<\/code> pr\u00fcft und l\u00f6st das Compose-Modell auf, ohne das Ergebnis auszugeben. Fehlende gew\u00f6hnliche Variablen f\u00fchren normalerweise zu einer Warnung und einer leeren Ersetzung; <code>${VAR:?message}<\/code> lehnt dagegen fehlende oder leere Pflichtwerte ab. Aufgel\u00f6ste Ausgaben k\u00f6nnen Geheimnisse enthalten und ben\u00f6tigen gesch\u00fctzte Ablage.<\/p>\n<p>Der folgende Pr\u00fcfer wird als <code>check-compose.py<\/code> gespeichert. Die enge Beispielregel verlangt f\u00fcr jeden aufgef\u00fchrten Dienst Dauerbetrieb, einen ausdr\u00fccklich aktiven Healthcheck, die gezeigte JSON-Rotation und eine SHA-256-Image-Referenz. Geerbte Image-Healthchecks, Protokollvorgaben des Hosts und andere g\u00fcltige Regeln werden dabei nicht automatisch abgeleitet.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> json\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> re\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> sys\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">stack = json.<span class=\"cbb-function\">load<\/span>(sys.stdin)\n<\/span><span class=\"cbb-line\">failed = <span class=\"cbb-constant\">False<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">for<\/span> name, svc <span class=\"cbb-keyword\">in<\/span> stack.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"services\"<\/span>, {}).<span class=\"cbb-function\">items<\/span>():\n<\/span><span class=\"cbb-line\">    issues = &#91;&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> svc.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"restart\"<\/span>) <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-keyword\">in<\/span> (<span class=\"cbb-string\">\"always\"<\/span>, <span class=\"cbb-string\">\"unless-stopped\"<\/span>):\n<\/span><span class=\"cbb-line\">        issues.<span class=\"cbb-function\">append<\/span>(<span class=\"cbb-string\">\"restart policy needs review\"<\/span>)\n<\/span><span class=\"cbb-line\">    health = svc.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"healthcheck\"<\/span>) <span class=\"cbb-keyword\">or<\/span> {}\n<\/span><span class=\"cbb-line\">    test = health.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"test\"<\/span>) <span class=\"cbb-keyword\">or<\/span> &#91;&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> health.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"disable\"<\/span>) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> test <span class=\"cbb-keyword\">or<\/span> test&#91;<span class=\"cbb-number\">0<\/span>&#93; == <span class=\"cbb-string\">\"NONE\"<\/span>:\n<\/span><span class=\"cbb-line\">        issues.<span class=\"cbb-function\">append<\/span>(<span class=\"cbb-string\">\"explicit active healthcheck missing\"<\/span>)\n<\/span><span class=\"cbb-line\">    log = svc.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"logging\"<\/span>) <span class=\"cbb-keyword\">or<\/span> {}\n<\/span><span class=\"cbb-line\">    opts = log.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"options\"<\/span>) <span class=\"cbb-keyword\">or<\/span> {}\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> log.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"driver\"<\/span>) != <span class=\"cbb-string\">\"json-file\"<\/span>:\n<\/span><span class=\"cbb-line\">        issues.<span class=\"cbb-function\">append<\/span>(<span class=\"cbb-string\">\"logging differs from this example policy\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">elif<\/span> opts.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"max-size\"<\/span>) != <span class=\"cbb-string\">\"10m\"<\/span> <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">str<\/span>(opts.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"max-file\"<\/span>)) != <span class=\"cbb-string\">\"3\"<\/span>:\n<\/span><span class=\"cbb-line\">        issues.<span class=\"cbb-function\">append<\/span>(<span class=\"cbb-string\">\"example log rotation limits missing\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> re.<span class=\"cbb-function\">search<\/span>(<span class=\"cbb-string\">r\"@sha256:&#91;0-9a-f&#93;{64}$\"<\/span>, svc.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"image\"<\/span>, <span class=\"cbb-string\">\"\"<\/span>)):\n<\/span><span class=\"cbb-line\">        issues.<span class=\"cbb-function\">append<\/span>(<span class=\"cbb-string\">\"SHA-256 image reference missing\"<\/span>)\n<\/span><span class=\"cbb-line\">    result = <span class=\"cbb-string\">\"; \"<\/span>.<span class=\"cbb-function\">join<\/span>(issues) <span class=\"cbb-keyword\">if<\/span> issues <span class=\"cbb-keyword\">else<\/span> <span class=\"cbb-string\">\"example policy matched\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">\"{}: {}\"<\/span>.<span class=\"cbb-function\">format<\/span>(name, result))\n<\/span><span class=\"cbb-line\">    failed = failed <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">bool<\/span>(issues)\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> stack.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"services\"<\/span>):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">\"no services found\"<\/span>, file=sys.stderr)\n<\/span><span class=\"cbb-line\">    sys.<span class=\"cbb-function\">exit<\/span>(<span class=\"cbb-number\">2<\/span>)\n<\/span><span class=\"cbb-line\">sys.<span class=\"cbb-function\">exit<\/span>(<span class=\"cbb-number\">1<\/span> <span class=\"cbb-keyword\">if<\/span> failed <span class=\"cbb-keyword\">else<\/span> <span class=\"cbb-number\">0<\/span>)<\/span><\/code><\/pre><\/figure>\n<pre><code>umask 077\ndocker compose config --format json &gt; resolved.json &amp;&amp; python3 check-compose.py &lt; resolved.json<\/code><\/pre>\n<p>Exitstatus 0 best\u00e4tigt ausschlie\u00dflich die \u00dcbereinstimmung des aufgel\u00f6sten Modells mit dieser Regel. Weder Registry-Digest noch Anwendung, wirksame Ressourcenbegrenzung oder Sicherheit sind damit nachgewiesen. Bei Beanstandungen endet der Pr\u00fcfer mit Status 1; eine leere Dienstliste ergibt 2. Der vorausgehende Compose-Aufruf muss erfolgreich sein, bevor dessen Ausgabe gepr\u00fcft wird.<\/p>\n<h2>Wiederherstellungstests und n\u00fctzliche Signale<\/h2>\n<p>Ein kontrollierter Wartungstest umfasst Anwendungsende, Abh\u00e4ngigkeitsausfall, Host-Neustart, absichtlich angehaltene Dienste und Wiederherstellung aus einer Sicherung. Ein blo\u00dfer Containerneustart pr\u00fcft keine Datenwiederherstellung. Containerstatus, steigende Neustartz\u00e4hler, Health-Ausgabe, freier Speicherplatz, Speicherdruck und eine externe Verf\u00fcgbarkeitspr\u00fcfung liefern erg\u00e4nzende Hinweise. Ein Alarm sollte ein anhaltendes Problem beschreiben statt jede harmlose Zustands\u00e4nderung zu melden.<\/p>\n<h3>Bedeutet unhealthy eine automatische Reparatur durch Docker?<\/h3><p>Nein. Der Health-Status ist in diesem Compose-Aufbau eine Diagnoseinformation. Fehlgeschlagene Pr\u00fcfung und Ursache ben\u00f6tigen Untersuchung; automatische Wiederherstellung verlangt eine ausdr\u00fcckliche Strategie.<\/p>\n<h3>Schlie\u00dfen feste Images automatische Aktualisierungen aus?<\/h3><p>Nein. Ein Aktualisierungswerkzeug kann eine gepr\u00fcfte Digest-\u00c4nderung vorschlagen oder \u00fcbernehmen. Wiederholtes Abrufen desselben Digests allein w\u00e4hlt keine neue Version; Erfolgsmeldungen h\u00e4ngen vom jeweiligen Werkzeug ab.<\/p>\n<h3>Warum kann die H\u00e4rtung einen Start verhindern?<\/h3><p>Ein Einstiegsskript kann beschreibbare Pfade oder eine anf\u00e4ngliche Rechteanpassung ben\u00f6tigen. Dokumentierter Laufzeitbenutzer und notwendige Mounts bestimmen die L\u00f6sung. Beliebiges \u00c4ndern der Dateieigent\u00fcmer auf dem Host ist keine allgemeine Abhilfe.<\/p>\n<h2>Quellen<\/h2><ul><li><a href=\"https:\/\/docs.docker.com\/engine\/containers\/start-containers-automatically\/\">Docker: Container automatisch starten<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/engine\/containers\/resource_constraints\/\">Docker: Ressourcen begrenzen<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/compose\/how-tos\/startup-order\/\">Docker Compose: Start- und Stoppreihenfolge steuern<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/reference\/compose-file\/interpolation\/\">Docker Compose: Variablenersetzung<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/engine\/logging\/drivers\/json-file\/\">Docker: JSON-Dateien als Protokolltreiber<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/engine\/logging\/configure\/\">Docker: Protokolltreiber konfigurieren<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/reference\/dockerfile\/\">Dockerfile-Referenz: HEALTHCHECK<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/reference\/cli\/docker\/buildx\/imagetools\/inspect\/\">Docker Buildx: imagetools inspect<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/reference\/compose-file\/services\/\">Docker Compose: Dienstreferenz<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/reference\/cli\/docker\/compose\/config\/\">Docker Compose: Befehl config<\/a><\/li><li><a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/latest\/journald.conf.html\">systemd: journald.conf und Speicherung<\/a><\/li><li><a href=\"https:\/\/www.raspberrypi.com\/documentation\/computers\/configuration.html\">Raspberry Pi: Kernel-Startparameter konfigurieren<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/reference\/cli\/docker\/container\/run\/\">Docker: Sicherheitsoptionen beim Containerstart<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Neustartregeln, Healthchecks, Logrotation und Ressourcenlimits begrenzen unterschiedliche Betriebsrisiken. Ein validiertes Compose-Beispiel und ein gezielter Regelpr\u00fcfer zeigen M\u00f6glichkeiten und Grenzen; \u00dcberwachung, Updates und gepr\u00fcfte Wiederherstellung bleiben erforderlich.<\/p>\n","protected":false},"author":1,"featured_media":24240,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92632],"tags":[92214,92217,92208,92211,92235],"class_list":["post-13043","post","type-post","status-publish","format-standard","hentry","category-tutorials-de-raspberry-pi-de","tag-devops-de","tag-docker-de","tag-raspberry-pi-de","tag-self-hosting-de","tag-tutorial-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Neustartregel, Gesundheitspr\u00fcfung, Logrotation, Speichergrenze und ein fester Digest: die sechs Zeilen f\u00fcr einen Compose-Stapel im Dauerbetrieb.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Neustartregel, Gesundheitspr\u00fcfung, Logrotation, Speichergrenze und ein fester Digest: die sechs Zeilen f\u00fcr einen Compose-Stapel im Dauerbetrieb.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-16T10:45:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T11:07:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13043-composehard-20261024-dark.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten\",\"datePublished\":\"2026-09-16T10:45:00+00:00\",\"dateModified\":\"2026-10-26T11:07:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/\"},\"wordCount\":1317,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13043-composehard-20261024-dark.png\",\"keywords\":[\"DevOps\",\"Docker\",\"Raspberry Pi\",\"Self-Hosting\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/\",\"name\":\"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13043-composehard-20261024-dark.png\",\"datePublished\":\"2026-09-16T10:45:00+00:00\",\"dateModified\":\"2026-10-26T11:07:07+00:00\",\"description\":\"Neustartregel, Gesundheitspr\u00fcfung, Logrotation, Speichergrenze und ein fester Digest: die sechs Zeilen f\u00fcr einen Compose-Stapel im Dauerbetrieb.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13043-composehard-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13043-composehard-20261024-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/raspberry-pi-de\\\/tutorials-de-raspberry-pi-de\\\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten | Lukas Wojcik","description":"Neustartregel, Gesundheitspr\u00fcfung, Logrotation, Speichergrenze und ein fester Digest: die sechs Zeilen f\u00fcr einen Compose-Stapel im Dauerbetrieb.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten | Lukas Wojcik","og_description":"Neustartregel, Gesundheitspr\u00fcfung, Logrotation, Speichergrenze und ein fester Digest: die sechs Zeilen f\u00fcr einen Compose-Stapel im Dauerbetrieb.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-16T10:45:00+00:00","article_modified_time":"2026-10-26T11:07:07+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13043-composehard-20261024-dark.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten","datePublished":"2026-09-16T10:45:00+00:00","dateModified":"2026-10-26T11:07:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/"},"wordCount":1317,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13043-composehard-20261024-dark.png","keywords":["DevOps","Docker","Raspberry Pi","Self-Hosting","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/","name":"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13043-composehard-20261024-dark.png","datePublished":"2026-09-16T10:45:00+00:00","dateModified":"2026-10-26T11:07:07+00:00","description":"Neustartregel, Gesundheitspr\u00fcfung, Logrotation, Speichergrenze und ein fester Digest: die sechs Zeilen f\u00fcr einen Compose-Stapel im Dauerbetrieb.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13043-composehard-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13043-composehard-20261024-dark.png","width":1200,"height":630,"caption":"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/raspberry-pi-de\/tutorials-de-raspberry-pi-de\/tutorial-eine-docker-compose-datei-fur-den-unbeaufsichtigten-betrieb-auf-dem-raspberry-pi-harten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Eine Docker-Compose-Datei f\u00fcr den unbeaufsichtigten Betrieb auf dem Raspberry Pi h\u00e4rten"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13043","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13043"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13043\/revisions"}],"predecessor-version":[{"id":26776,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13043\/revisions\/26776"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/24240"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13043"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13043"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}