これで合っていますか?`launcher run` は現在実行中のコンテナを使用しないのでしょうか?

launcher run の仕組みを理解しようとしています。例えば:

groot@galaxy:/var/discourse$ sudo ./launcher run app whoami

サイトが稼働している場合、上記のコマンドは既存のコンテナに入り、whoami を実行するために bash を起動するのではなく、最後にブートストラップされたイメージに基づいて新しいコンテナを起動し、その中でコマンドを実行します。

つまり、コンテナ内で動作中のライブサイトについて launcher を使って学習したい場合は、launcher run ではなく launcher enter を使用するべきです。

こんにちは @EricGT

はい、多くの Discourse システム管理者は以下のように使用しています:

./launcher enter  <container_name>

これにより、実行中のコンテナに入り、そのステータスを確認したり(またはタスクを実行したり)できます。

ただし、これは Docker を直接使用することで「あなたがやりたいように」簡単に実行できることを覚えておいてください。実行中のコンテナからこの情報を取得するために、中間のシェルスクリプトを使用する必要はありません:

# docker exec -it  app whoami
root

docker exec コマンドの構文については、以下のリンクが役立つかもしれません。

いくつかの例を楽しく試してみましょう:

# docker exec -it  app ps aux | grep nginx | wc -l
4
# docker exec -it  app ps aux | grep redis | wc -l
2
# docker exec -it app df 
Filesystem     1K-blocks     Used Available Use% Mounted on
overlay         51043548 26426300  22005700  55% /
tmpfs              65536        0     65536   0% /dev
tmpfs            1017712        0   1017712   0% /sys/fs/cgroup
shm               524288        8    524280   1% /dev/shm
/dev/sda        51043548 26426300  22005700  55% /shared
tmpfs            1017712        0   1017712   0% /proc/acpi
tmpfs            1017712        0   1017712   0% /proc/scsi
tmpfs            1017712        0   1017712   0% /sys/firmware
failed to resize tty, using default size
# docker exec -it app du -sh /shared

403M /shared
# docker exec -it app du -sh /shared/uploads
2.0M	/shared/uploads
# docker exec -it app ls -l /var/www/discourse/plugins/
total 36
drwxr-xr-x  1 discourse discourse 4096 Jun  7 04:49 discourse-details
drwxr-xr-x  1 discourse discourse 4096 Jun  7 04:49 discourse-local-dates
drwxr-xr-x  1 discourse discourse 4096 Jun  7 04:49 discourse-narrative-bot
drwxr-xr-x  1 discourse discourse 4096 Jun  7 04:49 discourse-presence
drwxr-xr-x  1 discourse discourse 4096 Jun  7 04:49 discourse-unsupported-browser
drwxr-xr-x 12 discourse root      4096 Jun  7 04:49 docker_manager
drwxr-xr-x  1 discourse discourse 4096 Jun  7 04:49 lazy-yt
drwxr-xr-x 11 discourse root      4096 Jun  7 04:49 neo-revive-discourse
drwxr-xr-x  1 discourse discourse 4096 Jun  7 04:49 poll
root@localhost:/var/discourse# docker exec -it app ls -l /shared
total 112
drwxr-xr-x  3 discourse www-data  4096 May 23 09:57 backups
drwxr-xr-x 10 root      root      4096 Jun  7 04:55 letsencrypt
drwxr-xr-x  4 root      root      4096 May 23 09:43 log
drwxr-xr-x  2 postgres  postgres  4096 May 23 09:43 postgres_backup
drwx------ 19 postgres  postgres  4096 Jun  7 04:57 postgres_data
drwxrwxr-x  3 postgres  postgres  4096 Jun  7 04:57 postgres_run
drwxr-xr-x  2 redis     redis     4096 Jun  8 02:56 redis_data
drwxr-xr-x  2 root      root      4096 May 28 04:19 ssl
drwxr-xr-x  4 root      root      4096 May 23 09:52 state
drwxrwxrwx  4 discourse www-data  4096 Jun  7 04:57 tmp
drwxr-xr-x  3 discourse www-data  4096 May 23 09:46 uploads

これらの楽しい例が、あなたが質問されたように「コンテナ内で動作中のライブサイトについて学習する」ために docker exec をどのように活用できるかのアイデアを与えてくれることを願っています、@EricGT

さらにいくつかの例を楽しく試してみましょう:

# docker exec -it app ls -l /shared/tmp/redis.sock
srwxrwxrwx 1 redis redis 0 Jun  7 04:57 /shared/tmp/redis.sock

これは Unix ソケットが共有ボリュームにあるため必須ではありませんが、ご理解いただけると思います:

#docker exec -it app redis-cli -s /shared/tmp/redis.sock monitor
OK

(省略、多数のライブストリーミングデータ)

そして最後に、もちろんシステム管理者コマンドの定番中の定番:

root@localhost:~# docker exec -it app ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   6660   292 pts/0    Ss+  Jun07   0:00 /bin/bash /sb
root         627  0.0  0.0   2308    60 pts/0    S+   Jun07   0:01 /usr/bin/runs
root         628  0.0  0.0   2156    68 ?        Ss   Jun07   0:00 runsv cron
root         629  0.0  0.0   2156    64 ?        Ss   Jun07   0:00 runsv rsyslog
root         630  0.0  0.0   2156    68 ?        Ss   Jun07   0:00 runsv redis
root         631  0.0  0.0   2156    64 ?        Ss   Jun07   0:00 runsv postgre
root         632  0.0  0.0   2156    64 ?        Ss   Jun07   0:00 runsv nginx
root         633  0.0  0.0   2156    64 ?        Ss   Jun07   0:00 runsv unicorn
discour+     634  0.0  0.1  15128  2484 ?        S    Jun07   0:35 /bin/bash con
root         635  0.0  0.1  55176  3956 ?        S    Jun07   0:00 nginx: master
postgres     636  0.0  1.2 351840 26132 ?        S    Jun07   0:04 /usr/lib/post
root         637  0.0  0.0   2300    60 ?        S    Jun07   0:00 svlogd /var/l
redis        638  0.3  0.3  56700  7880 ?        Sl   Jun07   4:01 /usr/bin/redi
root         639  0.0  0.0 156184   588 ?        Sl   Jun07   0:00 rsyslogd -n
root         640  0.0  0.0   8436  1216 ?        S    Jun07   0:00 cron -f
www-data     651  0.0  0.3  56628  6852 ?        S    Jun07   0:00 nginx: worker
www-data     652  0.0  0.0  55668  1676 ?        S    Jun07   0:00 nginx: cache 
postgres     657  0.0  1.8 352116 36776 ?        Ss   Jun07   0:01 postgres: 10/

(省略)

ご覧いただいた通り、あるいは想像できる通り、docker exec は非常に便利です。これらの例があなたの想像力を少し刺激してくれることを願っています、@EricGT

Discourse 用のさらにいくつかの便利な docker exec コマンドをご紹介します:

素晴らしい回答をありがとうございます。他の Docker システム管理者が何を重要視し、その情報をどのように素早く確認するかについて、貴重な洞察を得ることができました。ただし、Docker コマンド は私の古馴染みであり、私が本当に求めていたのは、単純な「はい」または「いいえ」の回答でした。

私の理解は正しいでしょうか?launcher run は現在実行中のコンテナを使用しませんか?

先日、launcher run コマンドの bash トレースを数時間分析し、その分析が正しいか確認したかったのです。launcher run が単一の whoami コマンドを実行するために、全く新しいコンテナを起動するとは予想していませんでした。さらに恐ろしいのは、コマンドが現在実行中のコンテナに対して機能し、ライブサイトを実行しているコンテナに関するフィードバックが得られると誤解した場合、実際には別のコンテナに関する情報が返されてしまうことです。

Docker コマンドを使ったあなたのやり方には完全に賛成です。私自身も同じように行うでしょう。ただし、$# の違いを理解していない限り、Docker コマンドからは遠ざかり、launcher に信頼を置くべきだと考えます。

あなたが、補助的な質問を前置きにして、素晴らしいと感じることを称賛するのを好むと知ったので、今後は時折、こっそりとそのような質問を加えてみます。:grinning:

@EricGT

はい、私も docker run を使用しています(ただし launcher run は使用しません)。しかし、run コマンドの後にシェルコマンドを追加して docker run を実行する理由をまだ見つけていません。前述の通り、私は常に docker exec を使用しているためです。

私の回答が「何かをアピールするための口実」だと感じられたようで申し訳ありません。私は実際、多くのプロジェクトで多忙を極めており、アピールするための口実など必要ありません。私が launcher run を使って Discourse コンテナ内でシェルコマンドを実行しないため、docker exec のみを使用していることを回答で述べ、あくまで あなたあなたのタスク を達成できるようお手伝いしようとしただけです。

今後の Discourse システム管理タスクのご活躍をお祈りします!

楽しんで、好奇心を持ち続けてください!

「launcher run」について具体的に質問している理由は、セルフホストの可能性を探っているため、他の Discourse 管理者向けに SOP マニュアルを作成しており、各ランチャーコマンドの詳細を理解してドキュメント化する必要があったからです。現在の SOP では、「launcher run」を使用すると新しいコンテナが作成されるため、使用しないよう警告しています。

./launcher run が新しいコンテナを起動し、そこでコマンドを実行するのは、おっしゃる通りだと考えられます。既存のコンテナでコマンドを実行したい場合は、ご指摘の通り docker を使用して実行する必要があります。

もし ./launcher がこのように動作しない場合、既存のコンテナが存在しない環境では機能しなくなります。