Install Discourse for development using Docker

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

pfaffman@shinytim:~/src/discourse-repos/discourse$ d/bundle install
Bundler 2.4.2 запущен, но ваш lockfile был создан с версией 2.4.1. Устанавливаю Bundler 2.4.1 и перезапускаю с этой версией.
Получение метаданных гема из https://rubygems.org/.
Получение bundler 2.4.1

Повторная загрузка гема из https://rubygems.org/ из-за ошибки (2/4): Bundler::PermissionError Произошла ошибка при попытке записи в `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Вероятно, вам нужно предоставить права на запись для этого пути.

Повторная загрузка гема из https://rubygems.org/ из-за ошибки (3/4): Bundler::PermissionError Произошла ошибка при попытке записи в `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Вероятно, вам нужно предоставить права на запись для этого пути.

Повторная загрузка гема из https://rubygems.org/ из-за ошибки (4/4): Bundler::PermissionError Произошла ошибка при попытке записи в `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Вероятно, вам нужно предоставить права на запись для этого пути.

Произошла ошибка при установке зафиксированной версии bundler (2.4.1). Повторите запуск с флагом `--verbose` для получения подробностей. Продолжаю работу с bundler 2.4.2.
Получение метаданных гема из https://rubygems.org/.........
Получение из https://github.com/discourse/mail.git
Произошла ошибка при попытке записи в `/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git`.
Вероятно, вам нужно предоставить права на запись для этого пути.
1 лайк

Я тоже столкнулся с этой проблемой.

1 лайк

Есть какие-то новости по этому вопросу?

Привет,

Я полный новичок. Я пытаюсь настроить Discourse на локальном Ubuntu 22.04 перед развёртыванием на GitHub, а затем на сервере (не знаю как, но сейчас это не важно).

Я попытался установить Discourse локально с помощью Docker (используя эту инструкцию).

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

sudo d/rails s

Получаю ошибку: «GitHub - discourse/mail: A Really Ruby Mail Library · GitHub ещё не проверен. Сначала выполните bundle install

А когда запускаю:

sudo d/bundle install

Получаю:
«Fetching GitHub - discourse/mail: A Really Ruby Mail Library · GitHub
Произошла ошибка при попытке записи в
/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git. Скорее всего, вам нужно предоставить права на запись для этого пути.»

Пожалуйста, подскажите :slight_smile:

Создан pull request для исправления этой проблемы — 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 лайк

Спасибо за отчеты — это должно быть исправлено в этом коммите

Сборка запущена, поэтому новый образ discourse_dev:release должен быть выгружен в течение следующего часа. После этого вам нужно выполнить d/shutdown_dev и d/boot_dev, чтобы применить изменения.

4 лайка

Как назначить этому контейнеру конкретный статический IP-адрес?

Привет! У меня была та же ошибка.

Мне удалось исправить это, перейдя в app/assets/javascripts и запустив yarn перед выполнением d/boot_dev --init.

Моя гипотеза заключается в том, что d/boot_dev --init предполагает наличие node_modules где-то в процессе выполнения. Это приводит к ошибке, если вы только что клонировали репозиторий, так как этой папки там нет.

1 лайк

После выполнения этого руководства на Ubuntu 22 команда d/boot_dev --init завершается следующим выводом:

Migrating database...
rake aborted!
Discourse::Utils::CommandError: /src/lib/discourse.rb:137:in `exec': mkdir: cannot create directory ‘/src/public/plugins/’: Permission denied
/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>'
(See full trace by running task with --trace)

Актуально ли ещё это руководство?

1 лайк

Чтобы выполнять команды (d/command) без sudo, нужно добавить себя в группу docker с помощью

sudo adduser $(whoami) docker

и затем снова войти в систему.

2 лайка

Привет,
У меня возникла точно такая же проблема.

Я сделал это:
Я добавил себя в группу docker и перезагрузил систему. Команда groups подтвердила, что я действительно состою в группе docker.

Тем не менее эта ошибка продолжает появляться.

Я работаю на Ubuntu 22.04, и Docker уже был установлен через Docker Desktop для других проектов. Учётная запись, с которой я работаю, не имеет прав администратора (не входит в группу sudo), но у меня есть доступ к учётной записи с такими правами. Однако я не могу использовать эту другую учётную запись для повседневной работы.
Является ли это проблемой?

Хм. У вас Ubuntu 22.04 на «голом железе» или она запущена как виртуальная машина WSL?

Обычный сервер. Ubuntu 22.04 работает нативно на моем рабочем ноутбуке.

Я заметил следующее:
Папка /src контейнера смонтирована в /home/gregor/repos/discourse на моей хост-машине:

На моей хост-машине, после клонирования репозитория через git, эта папка принадлежит мне и моей группе:

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/
[...]

Скрипты d/* выполняют все команды внутри контейнера Docker от имени пользователя discourse (см. здесь). А у этого пользователя discourse нет прав на запись в эту смонтированную папку /src.

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

Я могу воспроизвести это, если войду в контейнер и попробую создать там папки. Если сделать это от имени root, всё успешно.


На моей хост-машине:

Если же сделать это от имени пользователя discourse, операция не удалится:

Однако я пока не могу связать всё это воедино :thinking:

Хм. Я запускаю Ubuntu 22.04 внутри WSL в Windows:

После d/shell:

и

$ 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}]

Случайно ли ваш UID на хосте отличается от 1000? Если да, то проблема именно в этом. Пользователь Discourse внутри Docker имеет UID 1000, поэтому файлы на хосте должны быть доступны для записи пользователю с UID 1000.

Этот пост на SO указал мне в том же направлении, что и вы. Я могу подтвердить, что и пользователь gregor на хост-машине, и пользователь discourse в контейнере имеют одинаковый ID 1000.

Какой вывод у команд d/exec ls -lan и echo $UID?

После запуска d/shell:
image
я вижу, что все файлы принадлежат root, а не discourse, как на вашем скриншоте.

(У меня был предыдущий пост, где указывалось nobody/nogroup, что ввело в заблуждение, так как я экспериментировал с созданием пользователя и группы discourse на моей хост-машине, но это не дало результата. Поэтому я удалил пост)

Указывает, что все файлы внутри /src принадлежат пользователю root.


(Группа discourse возникла из более ранней попытки, которая не увенчалась успехом)

Спасибо большое за помощь, кстати. Чувствую себя немного глупо, должно быть, мне не хватает знаний о системе прав доступа Unix.

После долгих исследований и экспериментов я выяснил, что Docker Desktop на Linux является причиной проблем с правами доступа.

Дело в том, что приложение Discourse в контейнере Docker запускается от имени не-root пользователя, а именно пользователя discourse. Однако, как указано, например, здесь и здесь:

Docker Desktop на Linux запускает виртуальную машину, и контейнеры работают внутри этой виртуальной машины. В этом случае нельзя просто смонтировать папку хоста в контейнеры так же, как обычно, потому что сначала её нужно смонтировать в виртуальную машину.

Поэтому, как человек, который отнюдь не является экспертом по Docker, я вижу два способа решения этой проблемы:

(1) Отказаться от Docker Desktop на Linux и запустить Docker нативно

Это кажется наиболее устойчивым решением, так как контейнер Discourse, судя по всему, разработан для такого использования. Я колеблюсь только потому, что тогда мне придётся запоминать все команды для управления образами, контейнерами и ресурсами. И, будучи фронтенд-разработчиком, я бы предпочёл иметь UI для управления всем этим. Но, думаю, мне стоит воспринять это как инвестицию в изучение Docker.

ИЛИ

(2) Изменить владельца папок, смонтированных в контейнер

Мне удалось заставить этот подход работать и успешно запустить Discourse локально через Docker Desktop, однако я вижу множество предупреждений в терминале, поэтому не уверен, насколько это решение устойчиво в долгосрочной перспективе.

Это включает несколько шагов:

Шаг 1: Клонировать репозиторий

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

Шаг 2: Инициализировать контейнер

Из клонированной папки discourse на хост-машине выполните:

$ d/boot_dev

Что это делает? См. здесь.
Важно: Пропустите флаг --init, чтобы после создания контейнера ничего не выполнялось.

Шаг 3: Изменить владельца папок

Пользователь discourse внутри контейнера Docker имеет идентификатор 1000. В этом руководстве предполагается, что пользователь вашей хост-машины также имеет тот же идентификатор. Это может не сломать ничего, если у пользователя хост-машины другой идентификатор, но я не могу это проверить и поэтому не могу давать рекомендации для такой ситуации. Вы можете узнать свой идентификатор, выполнив id или echo $UID в терминале Linux.

На вашей хост-машине выполните:

# открыть оболочку в контейнере Docker
$ d/shell

# вы уже должны находиться в /src, но на всякий случай:
$ cd /src

# изменить владельца /src на пользователя и группу discourse
$ chown 1000:1000 .

# изменить владельца всех файлов и папок внутри /src на пользователя и группу discourse (не рекурсивно)
$ chown 1000:1000 *

# рекурсивно изменить владельца почти всех подпапок на пользователя и группу discourse
# basically все папки, кроме 'database', так как она принадлежит пользователю и группе 'postgres'
$ chown -R 1000:1000 app bin config d db docs documentation images lib log plugins public script spec test vendor

# проверить, что всё сработало, теперь должен отображаться пользователь и группа discourse
$ ls -l

# выйти из контейнера
$ exit

Шаг 4: Продолжить как обычно

Продолжите настройку контейнера и запуск Discourse, выполнив следующие команды на вашей хост-машине:

# установить gems
$ d/bundle install

# выполнить миграции базы данных
$ d/rake db:migrate
$ RAILS_ENV=test d/rake db:migrate

# создать администратора
$ d/rake admin:create

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

# И в отдельном терминале
d/ember-cli

Примечание:
Я столкнулся с предупреждениями вроде этого:
fatal: detected dubious ownership in repository at '/src'
Это связано с виртуализацией Docker Desktop на Linux.

Игнорируйте эти предупреждения. На вашей хост-машине выполните:

d/exec git config --global --add safe.directory /src

Почему Docker Desktop для Linux запускает виртуальную машину?

3 лайка