Developing Discourse using a Dev Container

Dev Containers is an open standard for configuring a development environment inside a container. This almost entirely eliminates the need to install/configure Discourse-specific tools/dependencies on your local machine, and makes it very easy to keep up-to-date as Discourse evolves over time.

Dev Containers can be used in a number of different IDEs, or directly using their reference CLI. This guide will describe the setup process for VSCode.

Getting started

  1. Download and install VSCode

  2. Install the Dev Containers extension in VSCode

  3. Clone the Discourse repository onto your machine

    git clone https://github.com/discourse/discourse
    
  4. In VSCode, use FileOpen Folder, then choose the Discourse directory

  5. Open the folder in its Dev Container. This can be done via the popup prompt, or by opening the command palette (Cmd/Ctrl + Shift + P) and searching for “Open folder in container…”

  6. If this is your first time launching a container, you will be prompted to install and start Docker Desktop. Once complete, go back to VSCode re-run “Open folder in container…”

  7. Wait for the container to download and start. When it’s done, the README will appear, and you’ll see the Discourse filesystem in the sidebar.

  8. Run the default build task using Ctrl + Shift + B (Cmd + Shift + B on mac).

    This will install dependencies, migrate the database, and start the server. It’ll take a few minutes, especially on the lower-end machines. You’ll see “Build successful” in the terminal when it’s done.

  9. Visit http://localhost:4200 in your browser to see your new Discourse instance

  10. All done! You can now make changes to Discourse’s source code and see them reflected in the preview.

Applying config/container updates

Every so often, the devcontainer config and the associated container image will be updated. VSCode should prompt you to “rebuild” to apply the changes. Alternatively, you can run “Dev Containers: Rebuild Container” from the VSCode command palette. The working directory, and your Redis/Postgres data will be preserved across rebuilds.

If you’d like to start from scratch with fresh database, you’ll need to delete the discourse-pg and discourse-redis docker volumes. This can be done from the “Remote Explorer” tab of the VSCode sidebar.

Discourse’s sample vscode .vscode/settings.json and .vscode/tasks.json will be copied when you first boot the codespace. From that point forward, if you want to use the latest sample config, you’ll need to manually copy .vscode/settings.json.sample to .vscode/settings.json.

References


This document is version controlled - suggest changes on github.

13 „Gefällt mir“

Hallo,

Kein Admin-Konto erstellt

Wenn ich den Docker-Container von außen über die Skripte in d/ verwende (z. B. d/boot_dev --init, wie in Install Discourse for development using Docker beschrieben), werde ich aufgefordert, im Rahmen des Prozesses ein Admin-Konto einzurichten.

Wenn ich ihn jedoch als Dev Container verwende und die Build-Schritte ausführe (Strg/Cmd + Umschalt + B), wird KEIN Admin erstellt.

Beim Überfliegen der Anweisungen hatte ich zunächst den Eindruck, dass die Erstellung eines Admins ziemlich mühsam ist; aber dann erkannte ich, dass alles, was es braucht, dieser Befehl ist, und hinterlasse ihn hier für diejenigen, die auf das gleiche Problem stoßen:

rake admin:create

(oder, wenn er sich über eine andere erforderliche Rake-Version beschwert: bundle exec rake admin:create)

6 „Gefällt mir“

Unter Windows 11, wenn Sie Probleme mit Zeilenenden vermeiden möchten, wie zum Beispiel:

[23963 ms] Start: Run in container: /bin/sh -c ./.devcontainer/scripts/start.rb
/usr/bin/env: ‘ruby\r’: No such file or directory
/usr/bin/env: use -[v]S to pass options in shebang lines

Stellen Sie sicher, dass Sie In Volume klonen

5 „Gefällt mir“

Es gibt vielleicht einen besseren Weg, aber um an Plugins zu arbeiten, habe ich einen Geschwisterordner namens discourse-plugins neben meinem Haupt-Discourse-Repository-Ordner. Dieser wird nach /workspace/plugins gemountet, sodass ich dann Symlinks innerhalb des Containers erstellen kann.

Das habe ich zu mounts in devcontainer.json hinzugefügt:
"source=${localWorkspaceFolder}/../${localWorkspaceFolderBasename}-plugins,target=/workspace/plugins,type=bind"

2 „Gefällt mir“

Das ist wirklich hilfreich, danke.

1 „Gefällt mir“

… Oder einfach git reset --hard
Hat bei mir funktioniert
Dann Dev Container: Rebuild Container und Ctrl-Shift-B

Wenn Sie OrbStack (nicht verbunden) in Ihrer lokalen macOS-Umgebung verwenden und Discourse über HTTPS mit einer benutzerdefinierten Domain ausführen möchten, aktualisieren Sie Ihre devcontainer.json mit den folgenden Ergänzungen:

  1. Geben Sie dem Container einen Namen.
  2. Fügen Sie die Wildcard-Domain .orb.local zur Umgebungsvariablen RAILS_DEVELOPMENT_HOSTS hinzu (Hostnamen müssen durch ein Komma getrennt sein).
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -13,10 +13,11 @@
   ],
   "remoteUser": "discourse",
   "remoteEnv": {
-    "RAILS_DEVELOPMENT_HOSTS": ".app.github.dev",
+    "RAILS_DEVELOPMENT_HOSTS": ".app.github.dev,.orb.local", // Schritt 2
     "PGUSER": "discourse",
     "SELENIUM_FORWARD_DEVTOOLS_TO_PORT": "9229",
   },
+  "runArgs": ["--name","discourse"], // Schritt 1
   "mounts": [
     "source=${localWorkspaceFolderBasename}-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume",
     "source=${localWorkspaceFolderBasename}-pg,target=/shared/postgres_data,type=volume",

p.s. Bitte lassen Sie mich wissen, wenn Sie wissen, wie ich den Hostnamen *.orb.local und den Containernamen dynamisch festlegen kann, wie es für GitHub Codespaces definiert ist. Das Festlegen des Werts als .app.github.dev,.orb.local hat bei mir nicht funktioniert.

Update: Irgendwie fehlte ein Eintrag in meiner /etc/hosts-Datei. Nachdem ich diese Zeile hinzugefügt hatte, konnte ich die Wildcard-Domain .orb.local in Schritt 2 verwenden.

Mit diesen Änderungen in der devcontainer.json-Datei kann ich jetzt meine lokale Discourse-Instanz unter https://discourse.orb.local/ ausführen.

/etc/hosts

Fügen Sie diese Zeile zu Ihrer /etc/hosts-Datei hinzu, falls sie noch nicht vorhanden ist.

##
# Docker und OrbStack
##
127.0.0.1 host.docker.internal

Bonus-Tipp 1
Wenn Ihre Netzwerkeinstellungen, Ihr Firmen-VPN oder ähnliches mit den IP-Bereichen von OrbStack-Containern in Konflikt geraten, aktualisieren Sie OrbStack mit einem anderen Bereich.

Bonus-Tipp 2
Wenn Sie Schritt 1 weglassen, erstellt OrbStack einen Container mit zufälligem Namen, aber Sie können HTTPS trotzdem ohne Angabe einer Portnummer verwenden. Der Nachteil ist der Containername, und damit wird der Domainname jedes Mal aktualisiert, wenn Sie den Container neu erstellen.