Dockerを使用して開発用にDiscourseをインストールする

Ubuntu VMからはrubygems.orgへのpingは通りました。Dockerコンテナからも通るか確認する方法があるかどうかはわかりません。httpsではなくhttp版をpingした可能性がありますが、その点に触れておきます。問題がそれに関連しているかもしれません。(ググって見つかったページの一つでは、httpsをhttpに変更することを提案していましたが、定義された動作がDockerコンテナ内にある以上、そのような変更はできません。)

「いいね!」 1

MacOSのオプションを試してみました。

まず、オプション2のHomebrewを使用しましたが、このガイドのコマンドではすべての依存関係がインストールされなかったため、問題に直面しました。https://medium.com/@yutafujii_59175/a-complete-one-by-one-guide-to-install-docker-on-your-mac-os-using-homebrew-e818eb4cfc3 を参考にすることで、少し先に進むことができました。

現在は ステップ2 d/boot_dev --init でつまずいています。

Migrating database...

rake aborted!

PG::ConnectionBad: could not connect to server: No such file or directory

Is the server running locally and accepting

connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

/src/lib/site_settings/db_provider.rb:61:in `table_exists?'

/src/lib/site_settings/db_provider.rb:16:in `all'

/src/lib/site_settings/defaults_provider.rb:29:in `db_all'

/src/lib/site_setting_extension.rb:277:in `block in refresh!'

/src/lib/site_setting_extension.rb:274:in `synchronize'

/src/lib/site_setting_extension.rb:274:in `refresh!'

/src/lib/site_setting_extension.rb:495:in `block in setup_methods'

/src/config/initializers/004-message_bus.rb:120:in `<main>'

/src/config/environment.rb:7:in `<main>'

/usr/local/bin/bundle:23:in `load'

/usr/local/bin/bundle:23:in `<main>'

Tasks: TOP => db:migrate => db:load_config => environment

(See full trace by running task with --trace)

その後、.dmg ファイルをダウンロードしましたが、Docker に不慣れなため、そこから何をすればよいかわかりません。macOS のオプションについて、もう少し詳しい説明があると助かります。

ありがとうございます。

「いいね!」 1

MacOS では、.dmg から Docker をインストールしたら、それが実行されていることを確認してください。MacOS のツールバーにステータスを確認できるアイコンが表示されます。その後、最初の投稿に記載されている手順(クローンなど)をそのまま従ってください。その方法で問題に遭遇した場合は、ここに投稿してください。

なお、以前 Homebrew で Docker をインストールしていた場合は、まずそれをアンインストールするか、少なくとも実行されていないことを確認することをお勧めします。私は Homebrew で Docker をインストールしたことがないため、その点についてはアドバイスできません。

「いいね!」 2

ありがとうございます。

アイコンをクリックして Docker ダッシュボードを開きましたが、そこには実行中のコンテナは見当たりませんでした。一方、コマンドラインでは複数のコンテナが実行されていることが確認できました。Docker ダッシュボードを使用するにはサインインが必要なのでしょうか?それとも、Homebrew と Desktop (.dmg) の両方に Docker がインストールされていることが原因でこのような動作になっているのでしょうか?

その間、DigitalOcean で Discourse のセットアップを完了し、問題なく動作することを確認しました。私の用途にはこれで十分です。

「いいね!」 1

DMG は Discourse ではなく Docker をインストールします。初期段階ではコンテナは追加されません。

その後、Docker ガイドに従ってください。

「いいね!」 2

上記のコマンドを実行した際(Mac 環境)、以下のエラーが発生します。

An error occurred while installing cppjieba_rb (0.3.3), and Bundler cannot continue.

Make sure that `gem install cppjieba_rb -v '0.3.3' --source 'https://rubygems.org/'` succeeds

before bundling.

何か解決策はありますでしょうか?問題の正確な原因がわかりません。個別に gem install を実行しても(sudo をつけても)うまくいきません。

また、Docker イメージを実行しているのに、なぜ gem のインストールが必要なのでしょうか?それはすでに完全にプリインストールされているはずだと思っていたのですが。

更新: 解決しました

~/repos/discourse へクローンしていましたが、正しくは ~/discourse でした。これで完璧に動作するようになりました。

「いいね!」 3

d/unicornを実行した際に以下のエラーが発生する場合:

Could not find aws-partitions-1.284.0 in any of the sources
Run `bundle install` to install missing gems.

以下のコマンドを実行することで解決できます:

docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "cd /src && USER=discourse RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 LD_PRELOAD=/usr/lib/libjemalloc.so RAILS_ENV=${RAILS_ENV:=development} bundle install"

その後、d/boot_devが正常に実行されるようになります。

「いいね!」 3

よりシンプルに

d/boot_dev
d/bundle install

一般的なタスクにはすべてヘルパーが用意されています。

「いいね!」 5

OP には以下のように書かれています。

Docker の開発フローでは、plugins/ ディレクトリ下のシンボリックリンクがサポートされています

この文脈では、plugins ディレクトリを何にシンボリックリンクすればよいのでしょうか?

よろしくお願いいたします。

「いいね!」 1
cd plugins
ln -s /full/path/to/your/plugin .
ln -s ~/src/my-great-plugin # 例
「いいね!」 6

ああ、ありがとう。この文脈では、プラグインディレクトリへのシンボリックリンクを意味しているだけです。

「いいね!」 1

一般的に、このワークフローではディレクトリ全体をシンボリックリンクすることはなく、実行時にスコープに含まれるプラグインを細かく制御したいためです。

「いいね!」 4

こんにちは、このガイドを使用しており、問題なく動作しています。ただし、d/boot_dev を実行するたびに、さまざまなファイルがダウンロードされてしまうことが気になります。必要なファイルを一度だけダウンロードし、次回起動時に再利用するにはどうすればよいでしょうか?私の OS は Ubuntu 20.04 です。

「いいね!」 1

Mint 20 の新規システムへのインストールを試みました。Docker は利用可能です:

terrapop@terrapop:/var$ docker version
Client: Docker Engine - Community
 Version:           19.03.12

terrapop@terrapop:/var/discourse$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset>
     Active: active (running) since Mon 2020-08-24 19:03:48 CEST; 31min ago

その後、Discourse をクローンしました:

sudo git clone GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub /var/discourse
cd /var/discourse

しかし、d/boot_dev --init を実行すると以下のエラーが発生します:

d/boot_dev --init

bash: d/boot_dev: そのようなファイルまたはディレクトリはありません

どなたかご存知でしょうか?

「いいね!」 1

更新:sendgrid の API キーを app.yml に追加し、./launcher を通じてアプリをブートストラップしたところ、ローカルホスト上で動作するようになりました。OP に記載された d/ コマンドがすべて時代遅れなのでしょうか?それでも、まだ理解できません。アプリは、Digital Ocean のステージング環境と同様に、Ubuntu (Mint) のローカルホスト上で Docker 経由で動作しています。ローカルホストでプラグインへのシンボリックリンクを使用して Docker 経由でアプリを実行しながら開発を行いたいのですが、d/ コマンドがどのようにも実行できないため、期待通りに準備できているか確信が持てません。どなたかご助言いただけますか?ありがとうございます。

更新:私のミスでした。本番用の git リンクを使用していました:

git clone GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub /var/discourse

代わりに、以下を使用すべきでした:

git clone GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub

:cowboy_hat_face:

しかし…

今度は新しい問題に直面しています。Ubuntu Mint 20 (UID 0) では、/var へのクローン操作はスーパーユーザー/root でのみ可能です。そのため、クローンして d/boot_dev --init を実行すると、すべてのダウンロードと起動は正常に行われますが、その後の段階でスクリプトが「Permission Error」をスローします。これは、スクリプトが UID 1000(Mint で最初に作成されたユーザー、つまり私の個人アカウント「terrapop」)で何かを実行することを期待しているためで、root ではありません。この問題を回避するにはどうすればよいでしょうか?

解決策:思っていたよりも簡単でした。単に var に新しい www ディレクトリを作成し、そのディレクトリの所有者と権限を Mint の最初のユーザーに変更し、OP の投稿に記載されている手順に従って進めるだけです。これで動作するようになりました。嬉しいです。

「いいね!」 2

なぜか、プラグインのソースディレクトリへのシンボリックリンクが機能せず、Docker コンテナを再起動した後に /admin/plugins にプラグインが表示されるようにするには、手動でプラグインのソースディレクトリを plugins ディレクトリへ移動またはコピーする必要がありました。

Docker のシンボリックリンクのサポート方法に変更があったのでしょうか?私は Ubuntu で docker-ce 19.03.12 を実行しています。

「いいね!」 1

私も最近、Docker Desktop for Mac で同じ経験をしました。

「いいね!」 1

私も同じ手順を$5のDO dropletで試しました。すべて正常に動作しました。では、サイトを公開してアクセスするにはどうすればよいのでしょうか?

P.S. ngrokでは動作します。9292番ポートへのnginxリバースプロキシはまだ動作していません

これを参考にしました。サーバー上でこれを行うことで、nginxリバースプロキシの設定を回避できます。d/oのdocker+vscodeリモート環境が快適に使えて嬉しいです :slight_smile:

サーバーを起動した後もシェルを使用できるようにするには、d/unicorn -Dでunicornをデーモンとして実行してください。

また、最低でも$10のd/o dropletが必要です。

「いいね!」 3

Macで zsh(iTerm2上)を使用しており、プラグイン開発にシンボリックリンクを使おうとすると、以下のエラーに直面します。

readlink: illegal option -- f
usage: readlink [-n] [file ...]

これは、Mac の readlink コマンドの実装が GNU のそれとわずかに異なるためです。

最も簡単な解決方法は、以下の手順を実行することです。

# brew install coreutils
# ln -s "$(which greadlink)" "$(dirname "$(which greadlink)")/readlink"

これにより、互換性のある readlink バージョンを使用できるようになります。

dirname "$(which greadlink)" の値が、通常は元の readlink がある /usr/bin よりも前の位置に PATH に設定されている必要があることを覚えておいてください。私の場合、PATH/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:... のようになっており、greadlink へのシンボリックリンクは /usr/local/bin にあります。

参考: Fixing "readlink: illegal option -- f" error on a Mac

「いいね!」 5

単一のプラグインのテストスイートを実行するには、以下のようにしてください。

# d/rake "plugin:spec[PLUGIN_NAME]"
「いいね!」 1