Install Discourse for development using Docker

Ich habe dies jetzt auf zwei Maschinen versucht und beide schlagen mit einem Berechtigungsfehler fehl.

pfaffman@shinytim:~/src/discourse-repos/discourse$ d/bundle install
Bundler 2.4.2 wird ausgeführt, aber Ihre Lockfile wurde mit 2.4.1 generiert. Bundler 2.4.1 wird installiert und die Ausführung mit dieser Version neu gestartet.
Gem-Metadaten von https://rubygems.org/ werden abgerufen.
Bundler 2.4.1 wird abgerufen

Erneuter Versuch, Gem von https://rubygems.org/ herunterzuladen aufgrund eines Fehlers (2/4): Bundler::PermissionError Es gab einen Fehler beim Versuch, in `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem` zu schreiben. Wahrscheinlich müssen Sie Schreibberechtigungen für diesen Pfad gewähren.

Erneuter Versuch, Gem von https://rubygems.org/ herunterzuladen aufgrund eines Fehlers (3/4): Bundler::PermissionError Es gab einen Fehler beim Versuch, in `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem` zu schreiben. Wahrscheinlich müssen Sie Schreibberechtigungen für diesen Pfad gewähren.

Erneuter Versuch, Gem von https://rubygems.org/ herunterzuladen aufgrund eines Fehlers (4/4): Bundler::PermissionError Es gab einen Fehler beim Versuch, in `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem` zu schreiben. Wahrscheinlich müssen Sie Schreibberechtigungen für diesen Pfad gewähren.

Beim Installieren der gesperrten Bundler-Version (2.4.1) gab es einen Fehler. Führen Sie das erneute Ausführen mit der Option `--verbose` für weitere Details aus. Fortfahren mit Bundler 2.4.2.
Gem-Metadaten von https://rubygems.org/ werden abgerufen.........
Abrufen von https://github.com/discourse/mail.git
Es gab einen Fehler beim Versuch, in `/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git` zu schreiben.
Wahrscheinlich müssen Sie Schreibberechtigungen für diesen Pfad gewähren.
1 „Gefällt mir“

Ich bin auch auf dieses Problem gestoßen.

1 „Gefällt mir“

Gibt es Neuigkeiten dazu?

Hallo,\n\nIch bin total neu und ein Noob. Ich versuche, Discourse auf dev Ubuntu 22.04 zu konfigurieren, bevor ich es auf GitHub und dann auf den Server (keine Ahnung wie, aber das spielt jetzt keine Rolle) einspiele.\n\nIch habe versucht, Discourse lokal mit Docker zu installieren (dieses Tutorial verwendet).\n\nIch glaube, ich habe Docker korrekt installiert, aber wenn ich eingebe:\n\nsudo d/rails s\n\nerhalte ich "GitHub - discourse/mail: A Really Ruby Mail Library ist noch nicht ausgecheckt. Führen Sie zuerst bundle install aus."\n\nund wenn ich ausführe\n\nsudo d/bundle install \n\nerhalte ich:\n"Fetching https://github.com/discourse/mail.git\nBeim Versuch, in\n/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git zu schreiben, ist ein Fehler aufgetreten. Es ist wahrscheinlich, dass Sie\nSchreibberechtigungen für diesen Pfad gewähren müssen."\n\nBitte um Rat :slight_smile:

Einen Pull-Request erstellt, um dies zu beheben – Setting bundler version to 2.4.1 which is same as version that generated lockfile to avoid failing script by nkirit · Pull Request #665 · discourse/discourse_docker · GitHub

1 „Gefällt mir“

Danke für die Berichte – dies sollte durch diesen Commit behoben sein.

Der Build läuft und ein neues discourse_dev:release-Image sollte in der nächsten Stunde hochgeladen werden. Danach müssen Sie d/shutdown_dev und d/boot_dev ausführen, um die Änderungen zu übernehmen.

4 „Gefällt mir“

Wie kann ich diesem Container eine bestimmte statische IP-Adresse zuweisen?

Hallo! Ich hatte denselben Fehler.

Ich konnte ihn beheben, indem ich in app/assets/javascripts ging und yarn ausführte, bevor ich d/boot_dev --init ausführte.

Meine Hypothese ist, dass d/boot_dev --init davon ausgeht, dass node_modules irgendwo in seiner Ausführung existiert. Dies schlägt fehl, da dies nicht der Fall ist, wenn Sie gerade das Repository geklont haben.

1 „Gefällt mir“

Nachdem ich diesem Tutorial auf Ubuntu 22 gefolgt bin, endet d/boot_dev --init mit der folgenden Ausgabe:

Datenbank wird migriert...
rake fehlgeschlagen!
Discourse::Utils::CommandError: /src/lib/discourse.rb:137:in `exec': mkdir: Verzeichnis ‘/src/public/plugins/’ kann nicht erstellt werden: Berechtigung verweigert
/src/lib/discourse.rb:171:in `execute_command'
/src/lib/discourse.rb:137:in `exec'
/src/lib/discourse.rb:33:in `execute_command'
/src/lib/plugin/instance.rb:727:in `activate!'
/src/lib/discourse.rb:352:in `block in activate_plugins!'
/src/lib/discourse.rb:349:in `each'
/src/lib/discourse.rb:349:in `activate_plugins!'
/src/config/application.rb:216:in `block in <class:Application>'
/src/lib/plugin.rb:6:in `initialization_guard'
/src/config/application.rb:216:in `<class:Application>'
/src/config/application.rb:75:in `<module:Discourse>'
/src/config/application.rb:74:in `<main>'
internal:/usr/local/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb:37:in `require'
internal:/usr/local/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb:37:in `require'
/home/discourse/.bundle/gems/ruby/3.2.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/src/Rakefile:7:in `<main>'
(Vollständige Trace durch Ausführen der Aufgabe mit --trace anzeigen)

Ist dieses Tutorial noch aktuell?

1 „Gefällt mir“

Um die Befehle (d/command) ohne sudo auszuführen, müssen Sie sich selbst zur docker-Gruppe hinzufügen, indem Sie

sudo adduser $(whoami) docker

eingeben und sich dann erneut anmelden.

2 „Gefällt mir“

Hallo,
Ich habe genau das gleiche Problem.

Das habe ich getan:
Ich habe mich zur docker-Gruppe hinzugefügt und das System neu gestartet. Mit dem Befehl groups habe ich überprüft, ob ich tatsächlich Teil der docker-Gruppe bin.

Diese Fehlermeldung erscheint immer noch.

Ich verwende Ubuntu 22.04 und hatte Docker bereits über Docker Desktop für andere Projekte installiert. Das Benutzerkonto, mit dem ich arbeite, hat keine Administratorrechte (ist nicht Teil der sudo-Gruppe), aber ich habe Zugriff auf ein Konto, das dies hat. Allerdings kann ich dieses andere Konto nicht für meine tägliche Arbeit verwenden.
Ist das ein Problem?

Hm. Läuft das auf einem Bare-Metal-Ubuntu 22.04 oder in einer WSL-VM?

Bare Metal. Ubuntu 22.04 nativ auf meinem Arbeitslaptop.

Mir ist Folgendes aufgefallen:
Der /src-Ordner des Containers wird auf meinem Host-System auf /home/gregor/repos/discourse gemountet:

Auf meinem Host-System gehört dieser Ordner nach dem Pull des Git-Repos mir und meiner Gruppe:

repos $ whoami
gregor
repos $ groups
gregor docker
repos $ pwd
/home/gregor/repos
repos $ ll
[...]
drwxrwxr-x 21 gregor gregor 4096 Mär 24 10:57 discourse/
[...]

Die d/*-Skripte führen alle Befehle innerhalb des Docker-Containers als discourse-Benutzer aus (siehe hier). Und dieser discourse-Benutzer hat keine Schreibrechte auf den gemounteten /src-Ordner.

rake aborted!
Discourse::Utils::CommandError: /src/lib/discourse.rb:137:in `exec': mkdir: cannot create directory ‘/src/public/plugins/’: Permission denied

Ich kann dies reproduzieren, wenn ich mich in den Container einlogge und versuche, dort Ordner zu erstellen. Wenn ich es als Root-Benutzer mache, gelingt es.


Auf meinem Host-System:

Wenn ich es als discourse-Benutzer mache, schlägt es fehl:

Ich kann das aber noch nicht ganz zusammenbringen :thinking:

Hm. Ich betreibe Ubuntu 22.04 innerhalb von WSL unter Windows:

Nach d/shell:

und

$ docker inspect -f "{{ .Mounts }}" discourse_dev
[{bind  /home/toka/dv/discourse/discourse/data/postgres /shared/postgres_data  delegated true rprivate}
 {bind  /home/toka/dv/discourse/discourse /src  delegated true rprivate}]

Ist Ihre UID auf dem Host zufällig nicht 1000? Wenn ja, liegt dort das Problem. Der Discourse-Benutzer innerhalb von Docker hat die UID 1000, daher müssen die Host-Dateien für UID 1000 beschreibbar sein.

Dieser SO-Post hat mich in die gleiche Richtung wie Sie gewiesen. Ich kann bestätigen, dass sowohl mein gregor-Benutzer auf dem Host-Rechner als auch der discourse-Benutzer im Container die gleiche ID 1000 haben.

Was ist die Ausgabe von d/exec ls -lan und echo $UID?

Nachdem ich d/shell ausgeführt habe:
image
sehe ich, dass alle Dateien root gehören und nicht discourse, wie auf Ihrem Screenshot.

(Ich hatte einen früheren Beitrag, der nobody/nogroup zeigte, was irreführend war, weil ich mit der Erstellung eines discourse-Benutzers und einer discourse-Gruppe auf meinem Host-Rechner herumgespielt habe, was zu keinem Erfolg führte. Deshalb habe ich den Beitrag gelöscht)

Zeigt an, dass alle Dateien innerhalb von /src dem Root-Benutzer gehören.


(Die Discourse-Gruppe stammt aus einem früheren Versuch, der nicht erfolgreich war)

Vielen Dank für Ihre Hilfe. Ich fühle mich ein wenig dumm, ich muss etwas Wissen über das Unix-Berechtigungssystem verpassen.

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?

3 „Gefällt mir“