Vergessen Sie nicht, `docker remove app` auszuführen, wenn Sie Discourse neu installieren

Ich benutze Discourse nun schon seit mehreren Jahren. Ich richte alle 6 Monate eine neue Instanz ein. Mein Setup beinhaltet Docker und einen Nginx-basierten Proxy, daher ist es vielleicht etwas nicht standardmäßig. Aus diesem Grund verwende ich discourse-setup nicht.

Alle 6 Monate, wenn ich diesen Prozess wiederhole, nachdem ich eine frische Kopie von Discourse aus seinem Git geklont und ./launcher bootstrap app ausgeführt habe, schlägt der Container fehl. Das Log zeigt:

anacron: Can't chdir to /var/spool/anacron: No such file or directory
run-parts: /etc/runit/1.d/anacron exited with return code 1
run-parts: executing /etc/runit/1.d/00-ensure-links
run-parts: executing /etc/runit/1.d/00-fix-var-logs
run-parts: executing /etc/runit/1.d/01-cleanup-web-pids
run-parts: executing /etc/runit/1.d/anacron
anacron: Can't chdir to /var/spool/anacron: No such file or directory

ad infinitum.

Ich mache dann normalerweise eine Reihe von Schritten, um neu zu booten, neu zu starten, Plugins zu entfernen, sie wieder hinzuzufügen usw., bis es endlich funktioniert, ohne jemals zu erfahren, was es letztendlich zum Laufen gebracht hat. 6 Monate später passiert wieder dasselbe. Ich arbeite nur daran, es zu beheben, und es ist nicht klar, welcher der vielen Schritte, die ich dann unternehme, es letztendlich zum Laufen gebracht hat.

Dieses Mal glaube ich jedoch, das Problem endlich gefunden zu haben, und es ist dieses: Anscheinend startet ./launcher start app alte Container-Instanzen namens app neu, auch wenn Discourse neu geklont und neu gebootet wurde.

Der fehlende Schritt ist docker remove app. Zusammenfassend:

./launcher stop app
docker remove app
... jetzt neu klonen, neu booten und launcher start app funktioniert

Mein Fehler war zu erwarten, dass nach der Ausführung von ./launcher bootstrap app der nächste ./launcher start app das neue Container-Image starten würde, aber das scheint nicht der Fall zu sein. Natürlich geraten die Dinge mit dem alten Container in Aufruhr, da der Pfad /var/discourse/shared neu initialisiert wurde.

Ich hinterlasse dies hier, falls andere nach denselben Log-Fehlermeldungen suchen.

Als mögliche Verbesserung wäre es schön, wenn der Container erkennen würde, dass sich sein Verzeichnis /var/discourse/shared geändert hat.

2 „Gefällt mir“

Wenn Sie Bootstrap ausführen möchten, ist der “Discourse-Weg”

./launcher bootstrap app
./launcher destroy app
./launcher start app

Aber wenn Sie nur einen Container haben, gibt es keinen Grund, nicht einfach

./launcher rebuild app

wie in fast jedem Beispiel angegeben. Das stoppt den laufenden Container, erstellt einen neuen und startet ihn. Wenn der Bootstrap aus irgendeinem Grund fehlschlägt, können Sie den alten (normalerweise) mit ./launcher start app neu starten (wie Sie beschrieben haben).

Ich glaube, ich sehe das Problem, und es hängt mit der üblichen Vermischung von „Container-Instanz“ und „Container-Image“ zusammen.

Wenn Sie sich zum Beispiel 10. Post-Install Maintenance ansehen, heißt es dort:

Usage: launcher COMMAND CONFIG [--skip-prereqs] [--docker-args STRING]
Commands:
    start:      Start/initialize a container
    stop:       Stop a running container
    restart:    Restart a container
    destroy:    Stop and remove a container
    enter:      Use nsenter to get a shell into a container
    logs:       View the Docker logs for a container
    bootstrap:  Bootstrap a container for the config based on a template
    rebuild:    Rebuild a container (destroy old, bootstrap, start new)
    cleanup:    Remove all containers that have stopped for > 24 hours

In den meisten Fällen bezieht sich das Wort „Container“ in dieser Hilfeausgabe auf eine Instanz eines Containers. Außer bei „bootstrap“, wo es sich auf ein Image bezieht. (./launcher bootstrap verwendet docker commit, um ein neues Image zu erstellen, aus dem nachfolgende Container-Instanzen gestartet werden können.) Ich denke, das war unerwartet (und ich ging naiv davon aus, dass es auch die aktuelle app-Instanz betreffen würde).

Bei rebuild bezieht sich das Wort „Container“ sowohl auf Container-Images als auch auf Instanzen, da es eine Reihe von Operationen beinhaltet, die sowohl Container-Instanzen als auch Container-Images betreffen.

Und es ist nicht klar, worauf es sich bei cleanup bezieht – werden nur die Instanzen entfernt oder auch das gebootstrappte Image?

1 „Gefällt mir“