Install Discourse for development using Docker

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