Manchmal sucht man bei Docker minutenlang nach einem großen Fehler – und am Ende ist nur ein einziges Zeichen schuld. Genau das ist mir beim Einrichten des EuroOffice Documentservers passiert. Die Compose-Datei sah auf den ersten Blick richtig aus, trotzdem wollte Docker sie nicht verarbeiten.
Der Fehler steckte in dieser Zeile:
JWT_SECRET: "secret“Code-Sprache: HTTP (http)
Vorne steht ein normales gerades Anführungszeichen. Hinten steht dagegen ein typografisches Anführungszeichen. Der Unterschied ist auf dem Smartphone oder in manchen Schriftarten kaum zu erkennen. Für YAML sind es trotzdem zwei völlig verschiedene Zeichen.
Woher kommen die falschen Zeichen?
Solche Zeichen schleichen sich häufig beim Kopieren aus Textverarbeitungen, Webseiten, Messengern oder KI-Chats ein. Manche Programme ersetzen gerade Anführungszeichen automatisch durch schönere typografische Varianten. Für normalen Text ist das praktisch. In Konfigurationsdateien kann es die gesamte Datei unbrauchbar machen.
Die korrigierte Zeile sieht so aus:
JWT_SECRET: "secret"Code-Sprache: JavaScript (javascript)
Ein echtes JWT-Secret sollte natürlich nicht einfach secret heißen. Das Beispiel zeigt nur den Unterschied zwischen den Zeichen.
Compose-Datei vor dem Start prüfen
Seit diesem Fehler gehört für mich ein zusätzlicher Befehl zur normalen Prüfung einer Compose-Datei:
docker compose config -q
Docker liest damit die Konfiguration ein und prüft sie, ohne Container zu starten. Bleibt die Ausgabe leer und endet der Befehl ohne Fehler, ist die Compose-Datei zumindest syntaktisch gültig. Die Variante mit -q ist außerdem praktisch, weil Docker die aufgelöste Konfiguration nicht vollständig im Terminal ausgibt. Darin könnten sonst auch eingesetzte Umgebungsvariablen auftauchen.
Zum gezielten Suchen nach typografischen Anführungszeichen kann unter Linux auch dieser Befehl helfen:
grep -n '[“”„‘’]' docker-compose.ymlCode-Sprache: JavaScript (javascript)
Gibt es einen Treffer, zeigt grep die betroffene Zeilennummer an. Der Befehl verändert die Datei nicht.
Zugangsdaten besser in die .env-Datei
Passwörter und JWT-Schlüssel schreibe ich möglichst nicht direkt in die docker-compose.yml. Stattdessen kann die Compose-Datei den Wert aus einer .env-Datei übernehmen:
environment:
JWT_ENABLED: "true"
JWT_SECRET: "${JWT_SECRET}"
JWT_HEADER: "AuthorizationJwt"Code-Sprache: JavaScript (javascript)
Einen ausreichend langen Zufallswert erzeugt beispielsweise OpenSSL:
openssl rand -hex 32
Der erzeugte Wert kommt anschließend in die .env-Datei:
JWT_SECRET=hier_den_erzeugten_zufallswert_eintragen
Die Datei sollte nicht öffentlich erreichbar sein und auch nicht versehentlich in einem öffentlichen Git-Repository landen.
Meine kurze Prüfung vor dem Containerstart
Nach einer Änderung gehe ich inzwischen immer gleich vor: zuerst docker compose config -q, danach docker compose up -d und anschließend ein Blick auf docker compose ps. Wenn ein Container nicht sauber startet, folgen die letzten Protokollzeilen mit docker compose logs --tail=50.
Der kleine Umweg spart oft deutlich mehr Zeit, als direkt auf Verdacht Einrückungen, Images oder Netzwerke umzubauen. In meinem Fall war Docker nicht das Problem. Es war schlicht ein hübsches, aber an der falschen Stelle verwendetes Anführungszeichen.
Passend dazu: WordPress mit Docker Compose und externem Nginx installieren – sauber und sicher.
Artikelbild: Foto von Florian Olivo auf Unsplash.
Weiterführende Dokumentation: docker compose config bei Docker.
Wie ist deine Meinung?
Schreib gern einen Kommentar unter dem Artikel oder diskutiere mit anderen im Matrix-Kanal:
#dasnetzundich:matrix.org