Install Discourse for development using Docker

両方のマシンで試しましたが、どちらも権限エラーで失敗しています。

pfaffman@shinytim:~/src/discourse-repos/discourse$ d/bundle install
Bundler 2.4.2 is running, but your lockfile was generated with 2.4.1. Installing Bundler 2.4.1 and restarting using that version.
Fetching gem metadata from https://rubygems.org/.
Fetching bundler 2.4.1

Retrying download gem from https://rubygems.org/ due to error (2/4): Bundler::PermissionError There was an error while trying to write to `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. It is likely that you need to grant write permissions for that path.

Retrying download gem from https://rubygems.org/ due to error (3/4): Bundler::PermissionError There was an error while trying to write to `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. It is likely that you need to grant write permissions for that path.

Retrying download gem from https://rubygems.org/ due to error (4/4): Bundler::PermissionError There was an error while trying to write to `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. It is likely that you need to grant write permissions for that path.

There was an error installing the locked bundler version (2.4.1), rerun with the `--verbose` flag for more details. Going on using bundler 2.4.2.
Fetching gem metadata from https://rubygems.org/.........
Fetching https://github.com/discourse/mail.git
There was an error while trying to write to `/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git`.
It is likely that you need to grant write permissions for that path.
「いいね!」 1

私もこの問題に遭遇しました。

「いいね!」 1

これに関して何かアップデートはありますか?

こんにちは、

私は全くの初心者です。GitHubにデプロイしてからサーバーにデプロイする前に、開発用のUbuntu 22.04でDiscourseを構成しようとしています(やり方はまだわかりませんが、今は重要ではありません)。

Dockerを使用してDiscourseをローカルにインストールしようとしました(このチュートリアルを使用しました)。

Dockerは正しくインストールされたと思いますが、次のように入力すると:

sudo d/rails s

GitHub - discourse/mail: A Really Ruby Mail Library is not yet checked out. Run bundle install first.」というエラーが表示されます。

そして、次のように実行すると:

sudo d/bundle install

「Fetching GitHub - discourse/mail: A Really Ruby Mail Library
There was an error while trying to write to
/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git. It is likely that you need
to grant write permissions for that path.」というエラーが表示されます。

アドバイスをお願いします :slight_smile:

これを修正するためのプルリクエストを作成しました - 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

レポートありがとうございます。これはこのコミットで修正されるはずです。

ビルドは実行中であり、1時間以内に新しい discourse_dev:release イメージがプッシュされる予定です。その後、変更を適用するには d/shutdown_devd/boot_dev を実行する必要があります。

「いいね!」 4

このコンテナに特定の静的IPアドレスを設定/付与するにはどうすればよいですか?

こんにちは。私も同じエラーが発生しました。

app/assets/javascripts に移動し、d/boot_dev --init を実行する前に yarn を実行することで修正できました。

私の仮説では、d/boot_dev --init は実行中に node_modules がどこかに存在することを前提としています。リポジトリをクローンしただけでは存在しないため、これは失敗します。

「いいね!」 1

Ubuntu 22 のこのチュートリアルに従った後、d/boot_dev --init は次の出力で終了します。

データベースを移行中...
rake aborted!
Discourse::Utils::CommandError: /src/lib/discourse.rb:137:in `exec': mkdir: ディレクトリ ‘/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>'
(タスクを --trace オプション付きで実行すると、完全なトレースが表示されます)

このチュートリアルはまだ最新ですか?

「いいね!」 1

d/command のようなコマンドを sudo なしで実行するには、以下のコマンドで自分自身を docker グループに追加する必要があります。

sudo adduser $(whoami) docker

その後、再度ログインしてください。

「いいね!」 2

こんにちは。
まったく同じ問題が発生しています。

実行しました。
docker グループに自分を追加し、システムを再起動しました。groups コマンドで、確かに docker グループの一員であることを確認しました。

それでも、このエラーが表示され続けます。

Ubuntu 22.04 を使用しており、他のプロジェクトのために Docker Desktop 経由で既に Docker をインストールしていました。使用しているユーザーアカウントには管理者権限がありません(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/* スクリプトは、discourse ユーザーとして Docker コンテナ内のすべてのコマンドを実行します (こちらを参照)。そして、その 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:

Hm. WindowsでWSL内のUbuntu 22.04を実行しています。

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 以外ではありませんか?もしそうであれば、それが問題の原因です。Docker 内の Discourse ユーザーは UID 1000 なので、ホストのファイルは UID 1000 によって書き込み可能である必要があります。

このSOの投稿は、あなたと同じ方向性を示唆しています。ホストマシン上の私のgregorユーザーとコンテナ内のdiscourseユーザーの両方が同じID1000を持っていることを確認できます。

d/exec ls -lanecho $UID の出力は何ですか?

d/shell を実行した後:
image
すべてのファイルが root によって所有されており、あなたのスクリーンショットのように discourse によって所有されていないことがわかりました。

(以前の投稿では nobody/nogroup と表示されていましたが、それは私がホストマシンに discourse ユーザーとグループを作成しようとして失敗したため、誤解を招くものでした。そのため、その投稿は削除しました)

/src 内のすべてのファイルが root ユーザーによって所有されていることを示します。


(discourse グループは、実りのなかった以前の試みから来ています)

ちなみに、ご協力いただきありがとうございます。Unix の権限システムについて何か知識が欠けているようで、少し愚かに感じています。

多くの調査と試行錯誤の結果、Linux上のDocker Desktopが権限の問題を引き起こしていることがわかりました。

DiscourseアプリケーションはDockerコンテナ内で、discourseという非rootユーザーとして実行されています。しかし、こちらこちらに書かれているように:

Linux上のDocker Desktopは仮想マシンを実行しており、コンテナはその仮想マシン内で実行されます。この場合、ホストフォルダをコンテナにそのままマウントすることはできません。まず仮想マシンにマウントする必要があります。

そのため、Dockerの専門家ではない私としては、この問題に対処するには2つの方法があると考えています。

(1) Linux上のDocker Desktopを廃止し、代わりにDockerをネイティブで実行する
これは最も持続可能な解決策のように思えます。Discourseコンテナはこのように使用されるように設計されているようです。ただし、イメージ、コンテナ、リソースを管理するためのすべてのコマンドを覚えておく必要があるため、ためらっています。また、フロントエンド開発者としては、管理用のUIがあった方が良いのですが、Dockerについてもっと学ぶための投資として取り組む必要があるのでしょう。

または

(2) コンテナにマウントされたフォルダの所有権を変更する
このアプローチは機能し、Docker DesktopからDiscourseをローカルで正常に実行することに成功しましたが、ターミナルに多くの警告が表示されるため、このソリューションが長期的にどの程度持続可能か確信が持てません。

これにはいくつかの手順が必要です。

ステップ1:リポジトリをクローンする

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

ステップ2:コンテナを初期化する

ホストマシン上のクローンされたdiscourseフォルダ内で、次を実行します。

$ d/boot_dev

何をするか? こちらを参照してください。
重要:コンテナ作成後に何も実行されないように、--initフラグを省略してください。

ステップ3:フォルダの所有権を変更する

Dockerコンテナ内のdiscourseユーザーのIDは1000です。このガイドでは、ホストマシンのユーザーも同じIDを持っていることを前提としています。ホストマシンのユーザーが異なるIDを持っている場合でも問題が解決しないわけではありませんが、テストできないため、その状況については言及できません。Linuxターミナルでidまたはecho $UIDを実行すると、IDを確認できます。

ホストマシンから、次を実行します。

# Dockerコンテナでシェルを開く
$ d/shell

# すでに/srcにいるはずですが、念のため:
$ cd /src

# /srcの所有権をdiscourseユーザーとグループに変更する
$ chown 1000:1000 .

# /src内のすべてのファイルとフォルダの所有権をdiscourseユーザーとグループに変更する(非再帰的)
$ chown 1000:1000 *

# discourseユーザーとグループにほとんどすべてのサブフォルダの所有権を再帰的に変更する
# 基本的に'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

# 1つのターミナルで:
d/rails s

# 別のターミナルで
d/ember-cli

注意:
次のような警告に遭遇しました。
fatal: detected dubious ownership in repository at '/src'
これはDocker Desktop on Linuxの仮想化機能によるものです。

これらの警告は無視してください。ホストマシンから、次を実行します。

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

Linux上のDocker DesktopがVMを実行する理由

「いいね!」 3