После долгих исследований и экспериментов я выяснил, что 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 запускает виртуальную машину?