Ho capito bene? `launcher run` non utilizza un container in esecuzione?

Nel tentativo di comprendere launcher run, ad esempio:

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

Se un sito è attivo e funzionante, il comando sopra non entra nel sito e avvia bash per eseguire il comando whoami, ma avvia un nuovo container basato sull’immagine bootstrappata più recente e poi esegue il comando.

In altre parole, se volessi utilizzare launcher per esplorare un sito live in esecuzione in un container, dovrei usare launcher enter invece di launcher run.

Ciao @EricGT

Sì, penso che molti amministratori di sistema Discourse utilizzino:

./launcher enter  <container_name>

… per entrare nel container in esecuzione e controllare lo stato (o eseguire attività) all’interno del container attivo.

Tuttavia, tieni presente che puoi fare “come sembri voler fare” usando direttamente Docker (e in modo semplice). Non c’è bisogno di utilizzare uno script shell intermedio per ottenere queste informazioni in un container in esecuzione:

# docker exec -it  app whoami
root

Potresti trovare utile questo link sulla sintassi del comando docker exec.

Proviamo qualche altro esempio per divertimento:

# 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

Speriamo che questi divertenti esempi ti diano qualche idea su come goderti l’uso di docker exec per “imparare a conoscere un sito live in esecuzione in un container”, come hai chiesto @EricGT

Ecco altri esempi per divertimento:

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

Questo non è necessario perché il socket Unix si trova nel volume condiviso, ma hai capito l’idea:

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

(troncato, tonnellate di dati live in streaming)

e infine, ovviamente, il nostro preferito “vecchio soldato” dei comandi di amministrazione di sistema:

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/

(troncato)

Come puoi vedere o immaginare, docker exec è molto utile e speriamo che questi esempi stimolino un po’ la tua immaginazione, @EricGT

Ecco alcuni comandi docker exec utili per Discourse:

Quella è stata una risposta fantastica e sono molto grato per il riscontro che mi ha dato un’idea di come altri amministratori di sistemi Docker valutino le priorità e di come accedere rapidamente a tali informazioni. Tuttavia, i comandi Docker sono un vecchio amico per me, e quello che volevo davvero era solo una semplice risposta sì o no alla seguente domanda:

Ho capito bene? launcher run non utilizza un container attualmente in esecuzione?

Qualche giorno fa ho dedicato alcune ore ad analizzare un tracciato bash del comando launcher run e volevo solo essere sicuro che la mia analisi fosse corretta. Non mi sarei aspettato che launcher run avviasse un intero nuovo container solo per eseguire un singolo comando come whoami. Ancora più preoccupante è che, se si pensa che il comando funzioni sul container attualmente in esecuzione fornendo feedback sul container che gestisce il sito live, in realtà restituirà informazioni relative a un container diverso.

Concordo pienamente sul fatto che il metodo che stai utilizzando con i comandi Docker sia quello che adotterei anch’io, ma sono anche d’accordo nel dire che, a meno che tu non conosca la differenza tra $ e #, è meglio tenersi alla larga dai comandi Docker e affidarsi a launcher.

Ora che so che ti piace usare domande con una domanda ausiliaria come pretesto per fare degli elogi alle cose che trovi fantastiche, cercherò di inserirle furtivamente ogni tanto. :grinning:

Gentile @EricGT,

Sì, uso anch’io docker run (tuttavia, non launcher run); ma non ho davvero trovato un motivo per eseguire docker run e aggiungere un comando shell dopo il comando run, poiché, come ho già menzionato nella mia risposta, uso sempre docker exec.

Mi dispiace che tu abbia considerato la mia spiegazione sul perché uso docker exec come un “pretesto per fare sfoggio di cose”. Ti assicuro che sono davvero impegnato in molti progetti e non ho bisogno di pretesti per fare sfoggio; stavo solo cercando di aiutarti tu a completare il tuo compito, dato che non uso launcher run per eseguire comandi shell in un contenitore Discourse, ma solo docker exec, come ho già specificato nella mia risposta, nel tentativo di esserti utile.

In bocca al lupo per le tue future attività di amministrazione di sistema su Discourse!

Divertiti e mantieni viva la curiosità!

Il motivo per cui chiedo specificamente di launch run è che sto creando un manuale SOP per altri amministratori di Discourse, mentre stiamo esplorando la possibilità di un hosting autonomo, e avevo bisogno di comprendere ogni comando del launcher in dettaglio per documentarlo. Al momento, le note SOP indicano che l’uso di launcher run creerà un nuovo container, quindi avverte di non utilizzare launcher run.

Credo che tu abbia ragione: ./launcher run avvia un nuovo container ed esegue il comando al suo interno. Se desideri eseguire il comando nel container esistente, devi farlo tramite docker, come discusso.

Se ./launcher non si comportasse in questo modo, non potrebbe funzionare senza un container già esistente.