Falsche Umgebungsvariablen betreffen zunächst die Konfiguration des Containers, nicht automatisch das NAS-Volume oder die darin gespeicherten Daten. Akute Datengefahr entsteht jedoch, wenn eine Anwendung wegen eines falschen Pfads, Datenbankziels oder Initialisierungswerts in ein neues leeres Verzeichnis schreibt. Sichere deshalb zuerst die bestehende Containerdefinition, die wirksamen Variablen und die Volume-Zuordnungen. Lösche oder initialisiere weder Containerdaten noch Speicherordner, bevor eindeutig feststeht, welche Konfiguration der laufende Container tatsächlich verwendet.
.env-Datei, env_file und Container-Umgebung sind drei verschiedene Ebenen
Der häufigste Fehler liegt nicht im Inhalt einer Variablen, sondern in der Annahme, eine Datei namens .env werde automatisch in jeden Container geladen. Das ist nicht der Fall. Je nach Startmethode erfüllt die Datei eine andere Aufgabe oder wird überhaupt nicht berücksichtigt.
- Eine .env-Datei kann Docker Compose Werte für Platzhalter in einer Compose-Datei liefern.
- Die Compose-Eigenschaft env_file übergibt Variablen aus einer angegebenen Datei an den Container.
- Der Abschnitt environment legt Variablen unmittelbar in der Containerdefinition fest.
- Eine grafische NAS-Oberfläche verwaltet Umgebungsvariablen häufig in eigenen Eingabefeldern. Eine neben der Compose-Datei abgelegte .env-Datei wird dabei nicht zwingend ausgewertet.
Diese Trennung erklärt ein typisches Fehlerbild: Der Platzhalter in der Compose-Datei wird richtig ersetzt, doch die Anwendung sieht die Variable nicht. Umgekehrt kann eine Variable im Container vorhanden sein, obwohl die Compose-Datei an einer anderen Stelle einen leeren oder unerwarteten Wert eingesetzt hat.
Ersetzung in der Compose-Datei
Ein Ausdruck wie ${APP_PORT} wird beim Verarbeiten der Compose-Konfiguration ersetzt. Das Ergebnis kann beispielsweise für eine Portzuordnung oder einen Pfad verwendet werden. Diese Ersetzung bedeutet noch nicht, dass im gestarteten Container eine Variable namens APP_PORT existiert.
Soll die Anwendung den Wert ebenfalls erhalten, muss die Variable in die Container-Umgebung übernommen werden. Eine mögliche Compose-Struktur sieht so aus:
Die Einrückung ist Bestandteil des YAML-Formats. In der tatsächlichen Datei sollten Leerzeichen statt Tabulatoren verwendet werden. Der Image-Name und das Tag sind durch die für deine Anwendung vorgesehenen Werte zu ersetzen.
Variablen über env_file übergeben
Mit env_file liest Compose eine angegebene Variablendatei ein und stellt deren Werte dem Container bereit. Das ist nützlich, wenn zahlreiche Anwendungseinstellungen getrennt von der Compose-Datei gepflegt werden sollen:
services:
app:
image: beispiel/image:tag
env_file:
– ./app.env
Der Pfad muss aus dem Kontext des verwendeten Compose-Projekts erreichbar sein. NAS-Oberflächen können Projektdateien intern in ein anderes Verzeichnis kopieren oder relative Pfade anders behandeln als ein manuell gestarteter Compose-Aufruf. Wird die Datei nicht gefunden, ist deshalb zuerst der Projektpfad zu prüfen und nicht die Anwendung neu zu installieren.
Die wirksame Konfiguration ohne Datenänderung feststellen
Bevor du Werte korrigierst, musst du unterscheiden, ob der Fehler beim Einlesen der Projektdatei, beim Erzeugen des Containers oder innerhalb der Anwendung entsteht. Die folgende Reihenfolge verhindert, dass eine neue Containerdefinition das ursprüngliche Fehlerbild verdeckt.
- Exportiere oder kopiere die verwendete Compose-Datei beziehungsweise dokumentiere die Einstellungen der NAS-Oberfläche mit Screenshots.
- Notiere Image und Tag, Containername, Netzwerke, Ports, Volume-Zuordnungen sowie alle sichtbaren Umgebungsvariablen.
- Prüfe die Anwendungsprotokolle auf Hinweise zu fehlenden Variablen, ungültigen Pfaden, einer unerreichbaren Datenbank oder einem nicht akzeptierten Wertformat.
- Ermittle die tatsächlich im Container gesetzte Umgebung über die Detailansicht der Containerverwaltung oder eine sichere Inspektionsfunktion.
- Vergleiche diese wirksamen Werte Zeichen für Zeichen mit der Variablendatei und der Compose-Definition.
- Ändere nur die nachweislich falsche Ebene und kontrolliere nach dem erneuten Erstellen des Containers zuerst Pfade und Volume-Ziele.
Die Oberfläche unterscheidet sich zwischen Containerverwaltungen und Versionen. Suche daher nach Funktionen wie Containerdetails, Inspektion, Projektkonfiguration oder Umgebungsvariablen, statt einen Menüpfad eines anderen NAS-Systems zu übertragen.
Eine Inspektion kann Kennwörter, Tokens und andere vertrauliche Werte anzeigen. Teile solche Ausgaben nicht ungefiltert und speichere Screenshots nur an einem geschützten Ort.
Welche Definition gewinnt, wenn ein Wert mehrfach vorkommt?
Mehrfach gesetzte Variablen sind eine häufige Ursache für scheinbar wirkungslose Änderungen. Ein Wert aus environment kann den gleichnamigen Eintrag aus env_file übersteuern. Zusätzlich können beim Start ausdrücklich übergebene Werte oder Einstellungen einer NAS-Oberfläche Vorrang erhalten. Welche Quellen beteiligt sind, hängt von der verwendeten Startmethode ab.
Gehe bei einem Konflikt von außen nach innen vor:
- Prüfe zuerst, ob die NAS-Oberfläche einen eigenen Wert in der Container- oder Projektdefinition speichert.
- Suche danach in der Compose-Datei nach demselben Variablennamen im Abschnitt environment.
- Kontrolliere anschließend die unter env_file eingebundene Datei.
- Prüfe zuletzt, ob ein Platzhalter aus einer .env-Datei oder aus der Umgebung des aufrufenden Prozesses ersetzt wird.
Entferne doppelte Definitionen, wenn sie keinen absichtlichen Zweck erfüllen. Eine einzige maßgebliche Stelle verringert das Risiko, dass eine spätere Änderung an der falschen Datei vorgenommen wird.
Syntaxfehler erkennen, bevor der Container neu erstellt wird
Eine Variablendatei sollte pro Zeile eine Zuweisung nach dem Muster NAME=Wert enthalten. Schon kleine Abweichungen können den Namen oder den Wert verändern.
- Verwende stabile Namen aus Buchstaben, Ziffern und Unterstrichen; der Name sollte nicht mit einer Ziffer beginnen.
- Setze keine Leerzeichen um das Gleichheitszeichen, sofern die eingesetzte Laufzeit oder Oberfläche deren Behandlung nicht eindeutig dokumentiert.
- Übernimm Variablennamen exakt. DATA_PATH und DATAPATH sind unterschiedliche Namen.
- Vermeide ein zusätzliches Gleichheitszeichen im Namen. Im Wert können Gleichheitszeichen je nach Parser zulässig sein.
- Kontrolliere unsichtbare Zeichen und Zeilenenden, wenn eine auf einem anderen System bearbeitete Datei nicht gelesen wird.
- Prüfe bei Werten mit Leerzeichen, Kommentarzeichen, Dollarzeichen oder Backslashes die Syntax der verwendeten Compose- beziehungsweise Container-Version. Unterschiedliche Einlesewege können Anführungszeichen und Sonderzeichen verschieden behandeln.
Ein häufiger Irrtum betrifft Anführungszeichen. Sie sind nicht bei jedem Parser nur optische Begrenzungen; je nach Startweg können sie entfernt, ausgewertet oder Bestandteil des Werts werden. Trage deshalb nicht vorsorglich jeden Wert in Anführungszeichen ein. Vergleiche stattdessen den im Container angekommenen Wert mit dem erwarteten Inhalt.
Leere Variable oder fehlende Variable?
Eine leere Zuweisung und eine nicht definierte Variable können für die Anwendung unterschiedliche Bedeutungen haben. OPTION= setzt möglicherweise einen leeren Wert, während das vollständige Weglassen der Zeile einen Standardwert der Anwendung aktiviert. Auch ein Compose-Ausdruck kann unbemerkt leer werden, wenn der verwendete Platzhalter nicht belegt ist.
Für notwendige Einstellungen ist es sinnvoll, die Compose-Verarbeitung bei einem fehlenden Wert abbrechen zu lassen. Compose unterstützt dafür Formen der Variablenersetzung, mit denen Pflichtwerte gekennzeichnet werden können. Nutze eine solche Prüfung nur mit der Syntax, die deine eingesetzte Compose-Version unterstützt, und validiere die Projektkonfiguration vor dem Start.
NAS-Pfade nicht mit Container-Pfaden verwechseln
Bei NAS-Containern beziehen sich Umgebungsvariablen häufig auf einen Pfad innerhalb des Containers. Dieser Pfad ist nicht automatisch identisch mit dem Ordner auf dem NAS. Die Verbindung entsteht erst durch die Volume-Zuordnung.
Angenommen, ein NAS-Ordner wird im Container unter /data eingebunden. Dann muss eine Anwendung, die innerhalb des Containers arbeitet, normalerweise /data verwenden und nicht den absoluten Host-Pfad des NAS. Zeigt die Variable stattdessen auf /config/data, kann die Anwendung dort einen neuen lokalen Ordner anlegen. Das wirkt anschließend wie Datenverlust, obwohl die bestehenden Dateien weiterhin im ursprünglichen NAS-Ordner liegen.
Prüfe bei Pfadvariablen immer als zusammengehöriges Paar:
- Welcher Ordner auf dem NAS ist die Quelle?
- Unter welchem Zielpfad ist er im Container eingehängt?
- Welchen dieser Pfade erwartet die Anwendung?
- Besitzt der im Container verwendete Benutzer Schreib- oder Leserechte am eingebundenen Ziel?
Bleibt ein Pfad nach der Korrektur leer oder schreibgeschützt, ist nicht automatisch die Variable falsch. Dann sind Mount-Zuordnung und Berechtigung getrennt zu prüfen. Ändere nicht gleichzeitig Pfad, Benutzerkennung und Dateirechte, weil sich die eigentliche Ursache danach kaum noch bestimmen lässt.
Eine fehlerhafte Variable mit geringem Risiko korrigieren
Viele Umgebungsvariablen werden nur beim Erzeugen oder Starten eines Containers eingelesen. Eine bearbeitete Datei verändert deshalb nicht zwingend einen bereits laufenden Container. Der sichere Rückweg besteht aus einer dokumentierten alten Definition und unveränderten persistenten Volume-Daten.
- Stoppe Schreibzugriffe auf die betroffene Anwendung, wenn die falsche Einstellung Datenpfade, Datenbanken oder Bibliotheken betrifft.
- Sichere die Compose-Datei, die Variablendatei und die Containerdefinition. Bei wichtigen Anwendungsdaten muss außerdem ein wiederherstellbares Backup der persistenten Ordner oder Datenbank vorliegen.
- Korrigiere genau einen Variablennamen oder Wert. Ändere dabei weder Image-Tag noch Volumes, Ports und Netzwerk, sofern diese nicht nachweislich Teil des Fehlers sind.
- Validiere die aufgelöste Projektkonfiguration mit der Prüffunktion deiner Compose- oder NAS-Containerverwaltung. Achte darauf, dass die Ausgabe Geheimnisse enthalten kann.
- Erstelle den Container mit derselben persistenten Volume-Zuordnung neu. Ein bloßer Neustart reicht nicht in jeder Umgebung aus, um geänderte Containerparameter zu übernehmen.
- Kontrolliere direkt nach dem Start die wirksame Variable, die Protokolle und den von der Anwendung verwendeten Datenpfad.
- Teste eine ungefährliche Funktion, etwa das Lesen vorhandener Daten, bevor du Schreibzugriffe oder automatische Aufgaben wieder freigibst.
Brich den Vorgang ab, wenn der neu erzeugte Container eine Ersteinrichtung anbietet, eine leere Bibliothek zeigt oder einen neuen Datenbestand initialisieren möchte. Das spricht häufig für eine falsche Volume-Zuordnung, einen abweichenden Containerpfad oder fehlende Rechte. In diesem Zustand darf die Anwendung keine produktiven Daten überschreiben.
Besondere Fälle: boolesche Werte, Zahlen und Listen
Umgebungsvariablen werden dem Prozess im Container grundsätzlich als Zeichenfolgen übergeben. Erst die Anwendung interpretiert true, false, 0, Portnummern oder kommagetrennte Listen. Deshalb kann ein syntaktisch gültiger Wert fachlich falsch sein.
- Einige Anwendungen erwarten true und false, andere 1 und 0 oder festgelegte Begriffe.
- Bei Zahlen können führende Zeichen, Leerstellen oder eine falsche Einheit die Auswertung verhindern.
- Listen können durch Kommas, Leerzeichen oder andere Trennzeichen aufgebaut sein. Maßgeblich ist die Dokumentation des verwendeten Images.
- Variablennamen und zulässige Werte können sich zwischen Image-Versionen ändern. Prüfe deshalb die Dokumentation genau für das eingesetzte Image und Tag.
Eine Variable gilt nicht allein deshalb als korrekt, weil sie in der Containerinspektion erscheint. Entscheidend ist, ob Name und Wert dem erwarteten Format der Anwendung entsprechen und das Anwendungsprotokoll die Einstellung ohne Fehler übernimmt.
Kennwörter gehören nicht ungeschützt in jede Projektdatei
Eine separate Variablendatei verbessert die Übersicht, ist aber kein sicherer Geheimnisspeicher. Ihr Inhalt liegt als lesbare Datei auf dem NAS und kann außerdem über Containerdetails, Exporte, Backups oder Diagnoseausgaben sichtbar werden.
Beschränke die Dateirechte auf die notwendigen Konten und nimm Dateien mit Zugangsdaten nicht in frei zugängliche Freigaben oder ungeschützte Versionsarchive auf. Unterstützen Anwendung und Containerverwaltung eine dafür vorgesehene Secret-Funktion, ist diese für Kennwörter und Tokens vorzuziehen. Ob sie verfügbar ist und wie sie eingebunden wird, hängt von der eingesetzten NAS-Plattform und der Betriebsart des Containers ab.
Nach der Bereinigung sollte jede Einstellung nur noch eine erkennbare Quelle besitzen. Die wirksame Containerumgebung muss mit der Projektdefinition übereinstimmen, die Anwendung muss ihre vorhandenen Volumes weiterverwenden und die Protokolle dürfen keine Hinweise auf Ersatzwerte oder eine erneute Initialisierung enthalten. Erst dann ist die Korrektur abgeschlossen.