Nach viel Recherche und Herumbasteln habe ich gelernt, dass Docker Desktop unter Linux die Berechtigungsprobleme verursacht.
Wie Sie sehen, wird die Discourse-Anwendung im Docker-Container als Nicht-Root-Benutzer ausgeführt, nämlich als discourse-Benutzer. Aber wie z. B. hier und hier geschrieben steht:
Docker Desktop unter Linux führt eine virtuelle Maschine aus und die Container werden innerhalb dieser virtuellen Maschine ausgeführt. In diesem Fall können Sie den Host-Ordner nicht einfach auf die gleiche Weise in die Container einbinden, da Sie ihn zuerst in die virtuelle Maschine einbinden müssen.
Daher sehe ich als jemand, der keineswegs ein Docker-Experte ist, zwei Möglichkeiten, dieses Problem anzugehen:
(1) Docker Desktop unter Linux aufgeben und stattdessen Docker nativ ausführen
Dies scheint die nachhaltigste Lösung zu sein, da der Discourse-Container anscheinend so konzipiert ist, dass er auf diese Weise verwendet wird. Ich bin nur zögerlich, weil ich mich dann an alle Befehle zur Verwaltung meiner Images, Container und Ressourcen erinnern muss. Und als Frontend-Entwickler würde ich eine Benutzeroberfläche zur Verwaltung von Dingen bevorzugen. Aber ich schätze, ich muss dies als Investition betrachten, um mehr über Docker zu lernen.
ODER
(2) Besitz der in den Container gemounteten Ordner ändern
Ich habe es geschafft, diesen Ansatz zum Laufen zu bringen und Discourse erfolgreich lokal von Docker Desktop auszuführen. Allerdings sehe ich eine Reihe von Warnungen im Terminal und bin daher nicht sicher, wie nachhaltig diese Lösung auf lange Sicht ist.
Dies beinhaltet mehrere Schritte:
Schritt 1: Repo klonen
$ git clone https://github.com/discourse/discourse.git
$ cd discourse
Schritt 2: Container initialisieren
Führen Sie im geklonten discourse-Ordner auf dem Host aus:
$ d/boot_dev
Was macht es? Siehe hier.
Wichtig: Lassen Sie das Flag --init weg, damit nach der Containererstellung nichts mehr getan wird.
Schritt 3: Besitzer der Ordner ändern
Der Discourse-Benutzer im Docker-Container hat die ID 1000. Diese Anleitung geht davon aus, dass Ihr Host-Benutzer ebenfalls diese ID hat. Es bricht möglicherweise nichts, wenn Ihr Host-Benutzer eine andere ID hat, aber ich kann dies nicht testen und kann daher nichts über diese Situation sagen. Sie können Ihre ID herausfinden, indem Sie id oder echo $UID in einem Linux-Terminal ausführen.
Führen Sie auf Ihrem Host aus:
# eine Shell im Docker-Container öffnen
$ d/shell
# Sie sollten sich bereits in /src befinden, aber nur zur Sicherheit:
$ cd /src
# den Besitzer von /src auf den Discourse-Benutzer und die Gruppe ändern
$ chown 1000:1000 .
# den Besitzer aller Dateien und Ordner innerhalb von /src auf den Discourse-Benutzer und die Gruppe ändern (nicht rekursiv)
$ chown 1000:1000 *
# den Besitzer fast aller Unterordner rekursiv auf den Discourse-Benutzer und die Gruppe ändern
# im Grunde alle Ordner außer 'database', da dieser dem Benutzer und der Gruppe 'postgres' gehört
$ chown -R 1000:1000 app bin config d db docs documentation images lib log plugins public script spec test vendor
# überprüfen, ob es funktioniert hat, sollte jetzt den Discourse-Benutzer und die Gruppe anzeigen
$ ls -l
# den Container verlassen
$ exit
Schritt 4: Wie gewohnt fortfahren
Fahren Sie mit der Einrichtung des Containers und dem Starten von Discourse fort, indem Sie auf Ihrem Host Folgendes ausführen:
# Gems installieren
$ d/bundle install
# Datenbank migrieren
$ d/rake db:migrate
$ RAILS_ENV=test d/rake db:migrate
# Admin-Benutzer erstellen
$ d/rake admin:create
# In einem Terminal:
d/rails s
# Und in einem separaten Terminal
d/ember-cli
Hinweis:
Ich stieß auf einige Warnungen wie diese:
fatal: detected dubious ownership in repository at '/src'
Dies kommt von der Virtualisierungssache von Docker Desktop unter Linux.
Ignorieren Sie diese Warnungen. Führen Sie auf Ihrem Host Folgendes aus:
d/exec git config --global --add safe.directory /src
Warum führt Docker Desktop für Linux eine VM aus?