ありがとうございます。しかし、プラグイン内でプラットフォーム依存のコマンドラインユーティリティを使用して情報を取得する方法は、私の要件では機能しません(以下のコマンドから Docker ID を取得する処理が、当社の Ubuntu 18.04 環境では動作しません):
# cat /proc/self/cgroup|grep "systemd:/docker"| awk -F/ '{print $3}'|cut -c1-12
#. (結果なし)
これでも結果は得られません:
# cat /proc/self/cgroup|grep "systemd:/docker"
# (結果なし)
参考情報(docker ps の出力):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
63c52bc571b5 local_discourse/socket-only "/sbin/boot" 28 minutes ago Up 28 minutes socket-only
631fbabedda9 local_discourse/socket-only2 "/sbin/boot" 26 hours ago Up 26 hours socket-only2
123743e12208 mysql/mysql-server "/entrypoint.sh mysq…" 2 days ago Up 20 hours (healthy) 33060/tcp, 0.0.0.0:6603->3306/tcp mysql-man
7a145366268c registry.unix.com/unix:condor "/run.sh" 6 days ago Up 20 hours 3306/tcp, 0.0.0.0:8999->80/tcp unix
3cc0c90c3e3a registry:2 "/entrypoint.sh /etc…" 7 days ago Up 7 days 0.0.0.0:5000->5000/tcp hubby
ca7b55fc5a0c local_discourse/data "/sbin/boot" 2 weeks ago Up 8 days data
つまり、実行中のコンテナ名を指定する文字列は、yml ファイル内の環境変数から取得する必要があります。これにより、情報がプラットフォームに依存せず、複数のコンテナが同時に実行されている場合でも機能します。
例えば、当社は複数の Discourse アプリと他のコンテナを同時に実行しており、docker-cli コマンドを使用しても、必要な正確な情報(リバースプロキシ設定によって決定され、Docker 自体ではなく Web 上で「その瞬間」に実行されているコンテナ名)を取得することはできません。
どのコンテナを表示するかは、リバースプロキシ設定で Unix ソケット名(または公開されたコンテナポート)を変更することで選択します。これにより、ゼロダウンタイムで 1 秒未満でコンテナを切り替えることができます。したがって、コンテナ名は yml ファイル内の環境変数から取得する必要があります。これにより 100% 信頼性が高く、正確になります。
したがって、文字列(コンテナ名、コンテナ ID など)は yml ファイル内の環境変数からのみ取得するという要件です。
コンテナ ID を好む方は、以下のように環境変数に追加することもできます(例):
DISCOURSE_APP_CONTAINER_NAME = 'socket-only (63c52bc571b5)'
あるいは:
DISCOURSE_APP_CONTAINER_NAME = '63c52bc571b5'
DISCOURSE_DATA_CONTAINER_NAME = 'ca7b55fc5a0c'
また、私の元の投稿にある通り(私たちが使用したい方法):
DISCOURSE_APP_CONTAINER_NAME = 'socket-only'
DISCOURSE_DATA_CONTAINER_NAME = 'data'
どの文字列(トークン)識別子(名前、コンテナ ID、またはその両方)を使用するかは、システム管理者(またはビジネス)の要件に基づいて決定されます。
そのため、情報は docker ps のような CLI コマンドや、他の OS(プラットフォーム)依存のコマンドからではなく、メインのアプリ yml ファイル内の環境変数としてハードコードされなければならないと明確に指定しました。
これで私の要件がより明確になったことを願っています。
これをプラットフォームや設定に中立にし、CLI コマンドやシステムコマンドに依存しないようにしたいと考えています。当社のサーバーでは Discourse だけでなく、Dockerized LAMP アプリ、Docker プライベートレジストリなど、他の多くのアプリも Docker で実行しています(上記の docker ps 出力サンプルをご参照ください)。