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 лайков

Привет,

Учётная запись администратора не создана

При использовании Docker-контейнера извне через скрипты в папке d/ (например, d/boot_dev --init, как указано в Install Discourse for development using Docker), система запрашивает создание учётной записи администратора в рамках этого процесса.

Однако при использовании в качестве Dev Container и выполнении шагов сборки (Ctrl/Cmd + Shift + B) учётная запись администратора НЕ создаётся.

Из беглого ознакомления с инструкциями у меня сначала сложилось впечатление, что создание администратора — дело довольно трудоёмкое; но затем я понял, что для этого достаточно выполнить всего одну команду, и оставляю её здесь для тех, кто столкнётся с той же проблемой:

rake admin:create

(или, если система жалуется на требуемую другую версию Rake: bundle exec rake admin:create)

7 лайков

В Windows 11, чтобы избежать проблем с символами конца строки, таких как:

[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

… обязательно используйте Клонирование в томе

6 лайков

Возможно, существует лучший способ, но для работы с плагинами я использую папку-близнец discourse-plugins рядом с основной папкой репозитория discourse. Она монтируется в /workspace/plugins, что позволяет создавать символические ссылки внутри контейнера.

Вот что я добавил в mounts в файле devcontainer.json:
"source=${localWorkspaceFolder}/../${localWorkspaceFolderBasename}-plugins,target=/workspace/plugins,type=bind"

2 лайка

Это действительно помогло, спасибо.

1 лайк

Или просто git reset --hard
У меня сработало
Затем Dev Container: Rebuild Container и Ctrl-Shift-B

Если вы используете OrbStack (не аффилирован) в локальной среде macOS и хотите запустить Discourse по HTTPS с пользовательским доменом, обновите ваш файл devcontainer.json, добавив следующее:

  1. Задайте имя контейнеру.
  2. Добавьте wildcard-домен .orb.local в переменную окружения RAILS_DEVELOPMENT_HOSTS (имена хостов должны быть разделены запятой).
--- 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", // Шаг 2
     "PGUSER": "discourse",
     "SELENIUM_FORWARD_DEVTOOLS_TO_PORT": "9229",
   },
+  "runArgs": ["--name","discourse"], // Шаг 1
   "mounts": [
     "source=${localWorkspaceFolderBasename}-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume",
     "source=${localWorkspaceFolderBasename}-pg,target=/shared/postgres_data,type=volume",

P.S. Дайте знать, если вы знаете, как динамически установить имя хоста *.orb.local и имя контейнера, как это сделано для GitHub Codespaces. Установка значения .app.github.dev,.orb.local не сработала для меня.

Обновление: Как выяснилось, в моём файле /etc/hosts отсутствовала необходимая запись. После добавления этой строки я смог использовать wildcard-домен .orb.local на шаге 2.

С этими изменениями в файле devcontainer.json теперь я могу запускать свой локальный экземпляр Discourse по адресу https://discourse.orb.local/

/etc/hosts

Добавьте эту строку в файл /etc/hosts, если у вас её ещё нет.

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

Бонусный совет 1
Если настройки вашей сети или корпоративный VPN конфликтуют с диапазонами IP-адресов контейнеров OrbStack, обновите настройки OrbStack, указав другой диапазон.

Бонусный совет 2
Если вы пропустите шаг 1, OrbStack создаст контейнер со случайным именем, но вы всё равно сможете использовать HTTPS без указания номера порта. Недостаток в том, что имя контейнера, а значит и доменное имя, будет обновляться при каждой пересборке контейнера.

1 лайк

Похоже, что Orbstack предназначен для запуска образов Docker. Если вы пытаетесь запустить продакшн-окружение, возможно, вам стоит воспользоваться:

Если речь идёт о разработке, то, насколько я знаю, Discourse использует образ discourse/discourse_dev - Docker Image. Однако вам, скорее всего, придётся настроить всё самостоятельно.

К сведению, я полагаю, что код команды Docker

находится по адресу discourse/bin/docker/boot_dev at main · discourse/discourse · GitHub.

1 лайк

Для тех, кто не привязан к VSCode, вот процесс работы с devcontainers с помощью только CLI devcontainers.
Предполагается, что devcontainers уже установлен:

Сборка контейнера

git clone https://github.com/discourse/discourse && cd discourse
devcontainer build
devcontainer up --workspace-folder .
devcontainer exec bash

После входа в контейнер необходимо установить зависимости:

pnpm install
bundle install
SKIP_MULTISITE=1 SKIP_TEST_DATABASE=1 bin/rake db:create db:migrate
DISCOURSE_DEV_ALLOW_ANON_TO_IMPERSONATE=1 bin/ember-cli -u > /dev/null 2>&1 &
  • Замените /dev/null на другой файл, если хотите сохранять логи.
  • Если нужно оставить процесс запущенным после отключения от оболочки, выполните команду disown.

Доступ к Discourse

docker inspect <name> | jq '.[0].NetworkSettings.Networks.bridge.IPAddress'

Это покажет IP-адрес, назначенный контейнеру.
Откройте в браузере http://<ipaddress>:4200.

Очистка

Чтобы удалить ваш devcontainer (опции down/delete ещё не реализованы):
Получите имя контейнера:
docker ps
Остановите и удалите контейнер:
docker stop <name> && docker rm <name>
Удалите тома:
docker volume rm discourse-node_modules discourse-pg discourse-redis

2 лайка