Esecuzione di comandi rails da Bash host

Ciao a tutti,

Voglio eseguire attività automatizzate di pulizia utenti dall’host Bash. Manualmente, eseguo

/var/discourse/launcher enter app
rails c
UserDestroyer.new(Discourse.system_user).destroy(User.find_by_username_or_email("user@example.com"), delete_posts: false)

Ho un’ampia lista di nomi utente da un file di testo che devono essere rimossi. Eseguire manualmente questa operazione non è ragionevole. Ho provato a racchiudere il comando di cancellazione in uno script bash. Quando eseguo rails c con il sottocomando launcher app, la connessione Redis fallisce:

/var/discourse/launcher run app "echo \"User.find_by_username_or_email('user@example.com')\" | rails c"
Failed to report error: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL) 2 Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL) subscribe failed, reconnecting in 1 second.

Tuttavia, quando confronto gli ambienti con export tra launcher enter app e launcher run app, sembrano praticamente identici. Cosa mi sto perdendo? launcher run si avvia in / mentre launcher enter entra direttamente in /var/www/discourse. Usare un cd prima di eseguire rails non aiuta.

Qualche suggerimento? Grazie!

Penso che docker run avvii un nuovo container.

Per cose del genere, uso docker exec invece di launcher, che esegue una serie di operazioni di cui non hai bisogno.

Grazie per la risposta. Trovo che il comportamento di Rails con docker exec sia anch’esso molto strano. Manualmente funziona perfettamente:

docker exec -it de7f5f6f649c '/bin/bash'
root@discourse-app:/# rails c
[1] pry(main)> User.find_by_username_or_email('myname')

Ma quando provo a eseguire rails c dall’esterno del container, ottengo i seguenti errori:

docker exec -it de7f5f6f649c "/usr/local/bin/rails console"
OCI runtime exec failed: exec failed: container_linux.go:367: starting container process caused: exec: "/usr/local/bin/rails console": stat /usr/local/bin/rails console: no such file or directory: unknown

Ma cosa più interessante:

docker exec -it de7f5f6f649c '/bin/bash -c "/usr/local/bin/rails"'
OCI runtime exec failed: exec failed: container_linux.go:367: starting container process caused: exec: "/bin/bash -c \"/usr/local/bin/rails\"": stat /bin/bash -c "/usr/local/bin/rails": no such file or directory: unknown

Perché c’è questa differenza?

Questo è previsto: stai dicendo a Docker di eseguire il file binario /usr/local/bin/rails console nel container. Cioè, un singolo file con uno spazio incorporato. Questo file non esiste.

Considera quanto segue:

○ → docker run -i debian /bin/echo hello
hello

○ → docker run -i debian '/bin/echo hello'
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "/bin/echo hello": stat /bin/echo hello: no such file or directory: unknown.
ERRO[0000] error waiting for container: context canceled 

Cita il comando nello stesso modo in cui lo eseguiresti dall’interno del container:

○ → docker exec -i app rails runner 'puts "hello"'
hello

Utilizzando l’esempio dell’OP, questo dovrebbe funzionare:

docker exec -i app rails runner 'UserDestroyer.new(Discourse.system_user).destroy(User.find_by_username_or_email("user@example.com"), delete_posts: false)'

Ok, è stato inaspettato per me perché non ho letto il RTFM. Grazie per il rapido aiuto.