Установка Discourse для разработки с помощью Docker

Разработка с использованием Docker

Поскольку Discourse работает в Docker, вы можете запускать Discourse напрямую из вашей исходной директории, используя контейнер для разработки Discourse.

:white_check_mark: Преимущества: Не нужно устанавливать зависимости системы, не требуется никакой конфигурации для быстрой настройки среды разработки.

:x: Недостатки: Будет работать немного медленнее, чем нативная среда разработки на Ubuntu, и значительно медленнее, чем нативная установка на MacOS.

Смотрите также Developing Discourse using a Dev Container

Шаг 1: Установка 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

Вы можете выполнить вышеуказанные команды в WSL, но все файлы должны находиться внутри файловой системы WSL. Например, всё работает отлично, если они находятся в ~/discourse, но не работают, если размещены в /mnt/c/discourse.

MacOS

:warning: Образ для разработки Discourse доступен только для архитектур x86_64. Mac с чипом M1 могут запустить образ с помощью эмуляции архитектуры, но Discourse, скорее всего, не загрузится из-за отсутствия поддержки inotify в QEMU.

Вместо этого используйте Install Discourse on macOS for development

Вариант 1: Загрузите упакованный .dmg из Docker store
Вариант 2: brew install docker

Шаг 2: Запуск контейнера

Склонируйте репозиторий Discourse на ваше локальное устройство.

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

(из корня исходного кода)

d/boot_dev --init
    # подождите, пока:
    #   - будут установлены зависимости,
    #   - выполнена миграция базы данных,
    #   - создан пользователь администратора (вам потребуется с ним взаимодействовать)

# В одном терминале:
d/rails s

# А в отдельном терминале
d/dev --only ember

…затем откройте браузер по адресу http://localhost:3000, и вуаля! Вы должны увидеть Discourse.

Символические ссылки плагинов

Среда разработки Docker поддерживает символические ссылки в директории plugins/ с одной оговоркой:

При создании новой символической ссылки плагина контейнер Docker необходимо перезапустить с помощью:

d/shutdown_dev; d/boot_dev

Примечания:

  • Для тестирования электронной почты запустите MailHog :

    d/mailhog
    
  • Если отсутствуют необходимые gem-пакеты, выполните:

    d/bundle install
    
  • Если требуется миграция базы данных:

    d/rake db:migrate RAILS_ENV=development
    
  • Когда вы закончите, вы можете остановить контейнер Docker с помощью:

    d/shutdown_dev
    
  • Данные сохраняются между запусками контейнера в вашей исходной директории tmp/postgres. Если по какой-то причине вы хотите сбросить базу данных, выполните:

    sudo rm -fr data
    
  • Если вы видите ошибки типа «отказано в доступе при попытке подключения к Docker», выполните:

    sudo usermod -aG docker ${USER}
    sudo service docker restart
    
  • Если вы хотите глобально открыть порты контейнера для сети (по умолчанию отключено), используйте:

    d/boot_dev -p
    
  • Dockerfile взят из discourse/discourse_docker на GitHub, в частности image/discourse_dev.

Запуск тестов

d/rake autospec

Для запуска тестов конкретного плагина можно также сделать следующее:

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

Или даже ещё более конкретно:

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

Этот документ находится под контролем версий — предложите изменения на 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 on local pc
Discourse developement environment setup
Install Discourse Docker on Ubuntu 11
External database ENV VARs not documented (external PG Port, external Redis ENV VARs)
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
Backup restore failing on clean dev docker env: FATAL: Peer authentication failed for user “postgres”
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'
Migrate a phpBB3 forum to Discourse
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
Installing discourse follow plugin in development (boot_dev) setup — no app.yml file
External database ENV VARs not documented (external PG Port, external Redis ENV VARs)
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?
Total newbie struggling to preview the signup modal with my test theme, what am I missing?
Configure Discourse to use a separate PostgreSQL server
Developing Discourse using a Dev Container
'Arrive at topic' info missing from email when re-sending invites
How to troubleshoot database errors in an outdated plugin?
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
Install Discourse on macOS for development
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
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)
How to Install Discourse on LocalHost in Windows?

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

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

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

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