こんにちは。Discourse が再起動または再起動後に起動したときに、Docker ネットワークに自動的に接続するフックを設定しようとしています。これにより、可能であれば管理者の Web アップデーターを使用できるようになりますが、これを行う最善の方法を模索しています。ドキュメントには、使用できるフックの種類がほとんど記載されておらず、after_post_boot や after_restart などのフックを検索しても何も得られません。これらのフックはもはや機能しないのですか、もしそうなら、なぜですか?以下は私のフックコードです。
hooks:
begin custom network hook
after_restart:
exec:
cmd:
- bash
- “-c”
- |
# Connect Discourse to the custom Docker network if not already connected
NETWORK_NAME=“proxy”
CONTAINER_NAME=$(hostname)
```yaml
# Create the network if it doesn't exist
if ! docker network inspect "$NETWORK_NAME" >/dev/null 2>&1; then
echo "Creating Docker network: $NETWORK_NAME"
docker network create "$NETWORK_NAME"
fi
# Connect container to the network (ignore if already connected)
echo "Connecting $CONTAINER_NAME to $NETWORK_NAME..."
docker network connect "$NETWORK_NAME" "$CONTAINER_NAME" 2>/dev/null || true
echo "Network connection complete."
```
END custom network hook
Ethsim2
(Ethan )
2025 年 11 月 8 日午後 10:54
2
app.yml には、実際には固定されたグローバルなフックタイプのリストはありません。
フックは Pups によって動的に提供され、含めるテンプレート内に存在するフックにのみアタッチできます。
仕組み
次のようなものを見た場合:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
これは、テンプレートに次のようなステップが含まれているため機能します。
- hook: code
run:
- exec: ...
Pups を使用すると、定義されたフックポイントの 前または後 にコマンドをアタッチできます。
したがって、テンプレートが hook: code を定義している場合、before_code: または after_code: を使用できます。
テンプレートが hook: assets_precompile を定義している場合、before_assets_precompile: または after_assets_precompile: を使用できます。
例えば hook: restart がない場合、after_restart: は単に実行されません。
標準テンプレートに存在するフック
Discourse Docker に同梱されているデフォルトの templates/*.yml から:
フック名
一般的な使用法
対応するもの
code
プラグインのクローン、カスタムファイルの編集などのメインセットアップステージ。
before_code: / after_code:
assets_precompile
Rails アセットのコンパイル後(例:S3 へのアップロード、クリーンアップ)
after_assets_precompile:
web
Web プロセスが起動する前の最終調整用
before_web:
プラグインインストールの例では、after_code: および before_code: がよく使用されます。これらはほとんどのセットアップで必要な唯一のものです。
デフォルトでは存在しないフック
after_restart や after_post_boot のような名前は、標準テンプレート内の hook: に対応しないため、Pups はどこにアタッチすればよいかわかりません。
カスタムテンプレートに一致する hook: restart ステップを追加しない限り、トリガーされません。
システムで利用可能なすべてのフックを見つける方法
/var/discourse フォルダから、次を実行します。
grep -R "hook:" -n templates/ samples/
これにより、現在含めているテンプレートでサポートされているすべてのフック名が一覧表示されます。
そこで見つけたものはすべて、hooks: ブロック内で before_<name>: または after_<name>: として使用できます。
参考
この動作は、Discourse Docker の Docker セットアップで使用される設定管理ツールである Pups README で簡単に説明されています。
「フックは、テンプレート内のポイントであり、hook: でラベル付けされたステップの前または後にコマンドを挿入できます。」
実践
ほとんどのカスタムシェルコマンド(プラグインのインストールなど)には after_code: を使用します。
コンテナの起動または再起動時に発生する必要があるものについては、新しいフック名を考案する代わりに、小さな起動スクリプトまたは supervisord タスクを使用します。
独自のフックタイプを追加するには、カスタム hook: something エントリを持つ新しいテンプレートを作成し、それを app.yml からターゲットにします。
TL;DR:
テンプレートに hook: エントリとして実際に表示されるフック名のみが存在します。
標準の Discourse Docker では、基本的に code、assets_precompile、および web です。
「いいね!」 2
参考までに、pups リポジトリはこちらだと思います。
Simple yaml based bootstrapper for Linux machines
@Ethsim2 「フックは、hook: でラベル付けされたステップの前または後にコマンドを挿入できるテンプレート内のポイントです。」という記述について、何も見つかりません。
Ethsim2:
「フックは、hook: でラベル付けされたステップの前または後にコマンドを挿入できるテンプレート内のポイントです。」
投稿する前に AI の回答を確認した方が良いかもしれませんね 。
README より:
フックを定義することで、特定のコマンドの前後にコマンドを実行します。
「いいね!」 1
pfaffman
(Jay Pfaffman)
2025 年 11 月 10 日午後 6:06
6
フックは役に立たないと思います。Web アップデーターを実行すると、コンテナが Docker ネットワークから切断されるということですか?
Web アップデーターはコンテナを再起動しないと確信しています。それが、Discourse をシャットダウンせずに実行できる理由です。
「いいね!」 1
これは正しいです。
また、hooks は discourse イメージをビルドするためにコンテナ内で実行されることにも注意してください。そこにあるものは何もホスト上で実行されず、ランチャー機能を通じて Docker ネットワークを再作成または破棄する方法はありません。
ホスティングでどのような問題が発生しているかを説明していただけると、何を解決しようとしているのかをよりよく理解できます。
「いいね!」 1
CLIでのみ更新され、そのコンテナが再起動するためDockerネットワークから切断されます。このセットアップではまだ試していないWebアップデーターを試してみます。ここで同じ動作が発生すると思いましたが、Webアップデーターがコンテナをシャットダウンしないのであれば、心配することはありません。私がこれらすべてを述べた理由は、Webアップデーターを実行したときに問題が発生するのを見たことがあるからです。しかし、アップデーターを試してみて、どうなるか見てみます。
Jonnyboy!iPhoneは最高!