Nginx.http.sockが不正なselinuxコンテキストで再作成されました

Discourse インスタンスを Apache のプロキシ経由でソケット通信させています。その設定は こちら に記載されています。

SELinux が有効なため、httpd がソケットを使用できるよう、推奨通りにソケットに httpd が読み書きできるコンテキストを付与しました。

semanage fcontext -a -t httpd_sys_rw_content_t /var/discourse/shared/standalone/nginx.http.sock
restorecon /var/discourse/shared/standalone/nginx.http.sock

これで問題なく動作します。素晴らしいです!

(余談ですが、ソケット自体は「コンテンツ」ではないため、httpd が他のランタイムインフラで使用する httpd_var_run_t の方が適切なコンテキストではないでしょうか?)

しかし、Discourse コンテナを再起動するたびに、ソケットファイルが元のコンテキストで再作成されてしまい、新しいコンテキストが適用されません。そのため、Apache が Discourse と通信できるようになる前に restorecon を実行する必要があります。これを手動で実行するのを忘れ、フォーラムにアクセスできなくなる可能性があります。crond スクリプトで定期的に restorecon を実行する方法も思いつきましたが、それは不格好なハックです。

ソケットファイルの作成時に正しいコンテキストが設定されるように、あるいは少なくとも作成プロセスの一部としてコンテキストがリセットされるようにするには、どうすればよいでしょうか?

コンテナを起動し、権限を変更する再起動スクリプトを作成します(再ビルドを行う別のスクリプトもあります)。

再起動スクリプトが検出できないのは、管理パネルから Web を介してアップグレードを行うケースです。これが前回の問題の原因となり、すべてのケースに対する解決策があるかどうか疑問に思いました。

また付け加えると、なぜソケットの作成時に正しいコンテキストが設定されないのか、私には理解できません。restorecon を実行すると、SELinux がソケットのデフォルトコンテキストを明確に認識していることがわかります。(また、semanage fcontextを実行して作成されたソケットのエントリが /etc/selinux/targeted/contexts/files/file_contexts.local に存在しているのも確認できます。)