Install Discourse for development using Docker

Developing using Docker

Since Discourse runs in Docker, you should be able to run Discourse directly from your source directory using a Discourse development container.

:white_check_mark: Pros: No need to install any system dependencies, no configuration needed at all for setting up a development environment quickly.

:x: Cons: Will be slightly slower than the native dev environment on Ubuntu, and much slower than a native install on MacOS.

See also Developing Discourse using a Dev Container

Step 1: Install Docker

Ubuntu

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce

19.10

sudo apt-get install docker.io
sudo usermod -a -G docker $USER
sudo reboot

Windows WSL: Ubuntu

You can run the above commands within WSL but you must have all the files inside WSL file system. E.g. it works just fine if it’s inside ~/discourse but it fails if it’s placed inside /mnt/c/discourse.

MacOS

:warning: The Discourse development docker image is only available for x86_64 architectures. M1 Macs are capable of starting the image using architecture emulation, but Discourse is unlikely to boot due to the lack of inotify support in QEMU.

Instead, you should use Install Discourse on macOS for development

Option 1: Download a packaged .dmg from the Docker store
Option 2: brew install docker

Step 2: Start Container

Clone Discourse repository to your local device.

git clone https://github.com/discourse/discourse.git
cd discourse

(from your source root)

d/boot_dev --init
    # wait while:
    #   - dependencies are installed,
    #   - the database is migrated, and
    #   - an admin user is created (you'll need to interact with this)

# In one terminal:
d/rails s

# And in a separate terminal
d/ember-cli

…then open a browser on http://localhost:4200 and voila!, you should see Discourse.

Plugin Symlinks

The Docker development flow supports symlinks under the plugins/ directory, with the following caveat:

Whenever a new plugin symlink is created, the Docker container must be restarted with:

d/shutdown_dev; d/boot_dev

Notes:

  • To test emails, run MailHog :

    d/mailhog
    
  • If there are missing gems, run:

    d/bundle install
    
  • If a db migration is needed:

    d/rake db:migrate RAILS_ENV=development
    
  • When you’re done, you can choose to kill the Docker container with:

    d/shutdown_dev
    
  • Data is persisted between invocations of the container in your source root tmp/postgres directory. If for any reason you want to reset your database run:

    sudo rm -fr data
    
  • If you see errors like “permission denied while trying to connect to Docker”, Run:

    run `sudo usermod -aG docker ${USER}`
    sudo service docker restart
    
  • If you wish to globally expose the ports from the container to the network (default off) use:

    d/boot_dev -p
    
  • The Dockerfile comes from discourse/discourse_docker on GitHub, in particular image/discourse_dev.

Running Tests

d/rake autospec

To run specific plugin tests, you can also do something like this:

d/rake plugin:spec["discourse-follow"]

Or even something like this to be even more specific:

my-machine:~/discourse$ d/shell
discourse@discourse:/src$ RAILS_ENV=test /src/bin/rspec plugins/discourse-follow/spec/lib/updater_spec.rb:37

This document is version controlled - suggest changes on github.

72 лайка
Using a launcher built docker image in docker-compose
IDE and comfortable DEV environment for newbies
Docker install on MacOS
How to install Discourse locally?
Installing Discourse for macOS Development Using asdf and docker-compose
Discourse developement environment setup
Discourse on local pc
External database ENV VARs not documented (external PG Port, external Redis ENV VARs)
How to Install Discourse on LocalHost in Windows?
Unicode (Russian) username validation fails randomly
Qunit in Docker
Is it possible to use a local plugin directory with a docker install?
Is it possible to use a local plugin directory with a docker install?
Problem with development on Windows with Docker and mounted volume
[Resolved] Recent change breaks connectivity in Docker (+ non-Docker)
How might we better structure #howto?
Apple M1 for discourse development
How to open via internal IP?
Fast, efficient plugin development with Docker dev install (Windows WSL2)
How do I install a stable version of Discourse on Docker locally?
Backup fails on localhost with docker
How do I install a stable version of Discourse on Docker locally?
Problems with understanding the development of Discourse
Need to create custom static page as home page
Docker new licensing
Install Discourse Docker on Ubuntu 11
Backup restore failing on clean dev docker env: FATAL: Peer authentication failed for user “postgres”
Install Discourse on macOS for development
Can't build Discourse on Ubuntu 20.10
Installing discourse for development is failing
Create, download, and restore a backup of your Discourse database
Set up a local Discourse Development Environment?
How do you install Discourse using Windows 10 Docker Desktop?
NoMethodError: undefined method `min_tags_from_required_group'
Install plugins in your non-Docker development environment
NoMethodError: undefined method `min_tags_from_required_group'
Error installing `bullseye-backports` when trying to install for Development
What I should do for migration from Cusdis to Discourse
Migrate a MyBB forum to Discourse
Local installation internal use only
Maintaining an up-to-date development environment
PG::UndefinedTable: ERROR: relation "pg_range" does not exist
Docker-compose.yml to run discourse locally
Allow subscription of predetermined length
Cannot load any images “Uncaught (in promise) no-response: no-response”
Discovery document is missing
What are the benefits of a dev environment?
Installing Discourse on windows using Docker Desktop
'Arrive at topic' info missing from email when re-sending invites
Installing discourse follow plugin in development (boot_dev) setup — no app.yml file
How to troubleshoot database errors in an outdated plugin?
Error when building: discourse does not support compiling scss/sass files via sprockets
Integration into custom auth system where emails are not unique?
Installer un environnement developpement discourse sur windows
Contributing to Discourse development
Install Discourse on Ubuntu or Debian for Development
There was an error while trying to write to `/src/Gemfile.lock`. It is likely that you need to grant write permissions for that path
Tags rearranged, triggering an extra edit
Ember addons are resolving as incorrect peer dependencies. -- fixed by removing "content-tag@3.1.0": "patches/content-tag@3.1.0.patch",
Trying to install Discourse on portainer but it's not pulling the base container
Developing Discourse using a Dev Container
Subscribe to post an ad
Postgres doesn't seem to be running when running Discourse locally using Docker
Discourse OpenID Connect (OIDC)
How can I install Discourse on Windows? Getting restarting (100) error
Dev environment: recommended way to bootstrap the first admin account without email?
Dev environment: recommended way to bootstrap the first admin account without email?
External database ENV VARs not documented (external PG Port, external Redis ENV VARs)
Configure Discourse to use a separate PostgreSQL server
Total newbie struggling to preview the signup modal with my test theme, what am I missing?
Discourse API developers docker-compose basic image
Which is the better option to self-host?
Using a launcher built docker image in docker-compose
Without any coding knowledge, is it possible to install and maintain Discourse?
I want to install a plugin for development, what should I do?
Can't uninstall on Ubuntu 18.04
Developing Discourse using a Dev Container
Using a launcher built docker image in docker-compose
Bundle install fails after adding gem "mysql2" and gem "reverse_markdown"
Issue in setup discourse on ubuntu server
`script/osx_dev` script is pretty broken
Can't set up dev environment due to cppjieba_rb failing to install
I want to install a plugin for development, what should I do?
Stuck in infinite loop in Mac terminal after source ~/.bashrc
Install on macOS – Failure: Scheduler::Defer can pause and resume
Install on macOS – Failure: Scheduler::Defer can pause and resume
Install Discourse for Development using Docker is Failed
OAuth2 and Microsoft ADFS
Migrate a phpBB3 forum to Discourse
Availability of OpenID Connect in hosted plans
Can't set up dev environment due to cppjieba_rb failing to install
Adding command line tools support for user api keys
Adding command line tools support for user api keys
Discourse redirects to the OAuth server after loading `/?authComplete=true`
Hello from Gitpod! (installing on google cloud + automated dev setup)

Настроить это действительно очень просто! Спасибо.

Однако меня удивляет, насколько медленной оказалась локальная установка. Можно ли как-то изменить спецификации контейнера? Я ожидал некоторого замедления, но, возможно, не настолько драматичного…

Спасибо ещё раз.

7 лайков

Я пытаюсь использовать Docker на Windows 10, и у меня есть вопрос по руководству. Docker установлен, и он может запускать контейнер Ubuntu (в котором практически ничего не установлено). В этом руководстве по Docker сказано просто клонировать репозиторий, но я не могу этого сделать, так как в контейнере не установлен git.

На этом этапе мне просто следовать руководству для Ubuntu и установить все необходимые компоненты внутри контейнера? Или мне следует использовать образ discourse_dev, упомянутый на Github? Кажется, что в этом руководстве пропущено множество шагов, но я никогда раньше не использовал Docker, поэтому, возможно, я что-то упускаю.

4 лайка

Думаю, проблема в том, что вы пытаетесь клонировать репозиторий внутри контейнера, но команду git clone нужно выполнять на вашем компьютере. Так что, если у вас уже установлен git локально, вы почти на пути к решению.

3 лайка

Я действительно сначала сделал именно это, что хорошо. Значит, у меня уже есть копия репозитория на моём локальном компьютере.

Доступ к файловой системе хоста из контейнера Docker у меня есть автоматически? Я, кажется, был частично сбит с толку командой d/boot_dev --init, потому что не понимал, что означает часть d/ (например, я не вижу в репозитории папки с именем d, хотя boot_dev присутствует).

3 лайка

Файл d находится в репозитории (прокрутите ниже) — это не папка, а символическая ссылка на bin/docker. Вы получите его при клонировании через git.

Я сам не использовал эту настройку extensively, но, насколько я понимаю, вы редактируете исходные файлы напрямую в файловой системе вашего хоста (которую вы только что проверили), а контейнеры docker монтируют её и работают с неё. Скрипты d/* выполнят за вас большую часть работы по настройке docker.

6 лайков

Спасибо за это. Я даже не подумал искать дальше папок. Думаю, у меня достаточно информации, чтобы ещё раз попробовать разобраться в этом.

3 лайка

Я всё ещё что-то делаю не так. Ни в этой теме, ни здесь, ни здесь нигде прямо не указано, какую команду docker нужно запустить. Я остановился на docker run -ti -v LocalRepoPath:/src discourse/discourse_dev, что инициировало множество процессов и, по-видимому, смонтировало репозиторий в /src. Но по какой-то причине я не могу запустить d/boot_dev --init. Даже простая команда ls в корневой директории репозитория выдаёт:

ls: невозможно получить доступ к 'adminjs': Ошибка ввода-вывода
ls: невозможно получить доступ к 'd': Ошибка ввода-вывода
ls: невозможно получить доступ к 'jsapp': Ошибка ввода-вывода

Не знает ли кто-нибудь, что здесь происходит?

3 лайка

Возможно, вы усложняете задачу: в руководстве в первом сообщении уже есть всё необходимое для начала работы.

Команды d/* выполняют всю магию с командами Docker, чтобы вам не приходилось этого делать. После клонирования репозитория достаточно выполнить команды d/boot_dev --init и d/unicorn (на хост-машине), чтобы заработал http://localhost:9292. Эти скрипты вызовут Docker для создания контейнера и запуска его за вас. Команда d/shutdown_dev остановит его.

Если вы получаете эти ошибки при просмотре файлов репозитория на хост-машине, значит, с вашей файловой системой что-то не так. Возможно, у вас закончилось место на диске?

4 лайка

вздох, понятно. Я думал, что их нужно запускать внутри Docker. Тем не менее, d/boot_dev --init, по-видимому, не работает в Windows в PowerShell (что, вероятно, объясняет, почему эта инструкция по Docker упоминает только хосты Mac и Ubuntu). Я попытался запустить команду в своей подсистеме Linux (v1), но, разумеется, это не сработало на этапе Docker, так как я установил Docker на Windows, а не в подсистему Linux.


Далее я попробовал запустить это в Git Bash для Windows. Я не смог выполнить d/boot_dev --init (ошибка «d/boot_dev: Is a directory»), но смог запустить bin/docker/boot_dev --init. Это продвинулось гораздо дальше, выполнив множество операций загрузки, но затем завершилось ошибкой:

C:\Program Files\Docker\Docker\resources\bin\docker.exe: Ошибка ответа от демона: Mount denied:
Исходный путь “PathToRepo/data/postgres;C”
не существует и не известен Docker.

Я, кажется, смог обойти это, экранировав путь монтирования, согласно:
https://stackoverflow.com/questions/50608301/docker-mounted-volume-adds-c-to-end-of-windows-path-when-translating-from-linux

После этого я получил эту ошибку:

C:\Program Files\Docker\Docker\resources\bin\docker.exe: Ошибка ответа от демона: OCI runtime create failed: container_linux.go:346: запуск процесса контейнера вызвал “exec: "C:/Program Files/Git/sbin/boot": stat C:/Program Files/Git/sbin/boot: нет такого файла или каталога”: неизвестно.

C:/Program Files/Git/sbin/boot не существует в моей файловой системе, так что ошибка, наверное, не удивительна. Единственное упоминание sbin/boot в файле boot_dev — это часть команды Docker: discourse/discourse_dev:release /sbin/boot.

И вот где я сейчас нахожусь… Я не совсем понимаю, что ещё можно попробовать.

3 лайка

Боюсь, что это предел моей помощи, так как я не знаком с Windows.

Возможно, @rishabh сможет подтвердить, должно ли это работать и в Windows, и дополнить недостающие шаги для этого (или добавить примечание, если это не так).

3 лайка

@sam, является ли то, что я пытаюсь сделать, хоть отдалённо поддерживаемым способом запуска Discourse для разработки? В теме по разработке на Windows вы упоминали, что пробовали это, но пока что у меня не очень получается. Базовые (не связанные с Discourse) контейнеры Ubuntu технически работают, но конкретные команды из первого сообщения в этой теме — нет.

Вы изначально написали мне следующее:

Так что, если у вас нет предложения, как помочь мне справиться с проблемами, которые я сталкиваю с Docker на Windows, вероятно, мне лучше прекратить тратить время и запустить его в виртуальной машине Ubuntu, используя, например, VirtualBox.

2 лайка

У многих из нас на медленном кольце вообще нет проблем. Игры работают, Steam работает, всё работает.

Я понимаю ваши опасения, но это действительно не такая уж большая проблема. В любом случае, если это для вас слишком страшно, я рекомендую использовать традиционную виртуальную машину, например Hyper-V или VirtualBox. Установите там Docker и воспользуйтесь нашей Docker-настройкой для разработки.

6 лайков

Если бы это не был мой основной (и единственный) компьютер, я бы присоединился к вам в группе с медленным обновлением, но я просто не могу рисковать. Поэтому я выберу традиционную виртуальную машину с Docker. Ещё раз спасибо за совет. Надеюсь, скоро всё заработает.

Какого объёма дискового пространства и оперативной памяти будет достаточно для выделения виртуальной машине? Я думал, возможно, 16 ГБ дискового пространства и 4 ГБ оперативной памяти, но сначала хотел уточнить.

1 лайк

Этого, вероятно, будет достаточно. Лучший способ найти идеальный рецепт — экспериментировать.

6 лайков

Ладно, я почти добрался до того, чтобы это действительно заработало. У меня запущен локальный экземпляр через Docker в виртуальной машине на Ubuntu. Я предполагаю, что d/boot_dev --init нужно запускать только один раз, в самом начале, а после этого просто d/boot_dev. Правильно ли я понимаю? Спрашиваю я это потому, что d/unicorn работает, если я добавляю --init, но не работает, если опускаю --init в d/boot_dev. Когда запуск не удаётся, я получаю ошибку:

Could not find aws-partitions-1.270.0 in any of the sources.
Run bundle install to install missing gems.

Но затем выполнение bundle install завершается ошибкой:

actionview_precompiler-0.2.2 requires ruby version >= 2.6, which is incompatible with the current version, ruby 2.5.1p57

Есть ли конкретная версия Ruby, до которой мне следует обновиться? Или здесь что-то ещё не так?


Моя виртуальная машина работает под управлением Ubuntu 18.04 (LTS), и на этот раз мне удалось напрямую следовать инструкциям из оригинального поста, так что я не уверен, где мог допустить ошибку (если она вообще есть).

2 лайка

Вам не следует использовать bundle install, нужно использовать d/bundle install. Вы хотите установить bundle внутри контейнера, виртуальной машине Ruby не нужен.

4 лайка

Да, я так и думал, просто не знал, как правильно запускать его в контейнере. Ещё раз спасибо за помощь!

2 лайка

Я скачал последнюю версию репозитория, и как обычно d/unicorn сообщает: «Запустите bundle install, чтобы установить отсутствующие гемы». Однако на этот раз при выполнении d/bundle install я получаю следующее:

Получение индекса источников с https://rubygems.org/

Повторная попытка получения из-за ошибки (2/4): Bundler::HTTPError Не удалось получить спецификации с https://rubygems.org/

Повторная попытка получения из-за ошибки (3/4): Bundler::HTTPError Не удалось получить спецификации с https://rubygems.org/

Повторная попытка получения из-за ошибки (4/4): Bundler::HTTPError Не удалось получить спецификации с https://rubygems.org/

Не удалось получить спецификации с https://rubygems.org/

В результате я не могу запустить Discourse в данный момент. Я понятия не имею, связано ли это с обновлением (напрямую или косвенно) или это совершенно другая проблема. Поиск ошибки в Google не принес особой пользы, поэтому я не знаю, как действовать дальше.

1 лайк

Вы смогли связаться с rubygems.org?

1 лайк