Ejecutando comandos de rails desde el host Bash

Hola a todos,

Quiero ejecutar tareas automatizadas de limpieza de usuarios desde el Bash del host. Manualmente, ejecuto:

/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) 

Tengo una lista larga de nombres de usuarios en un archivo de texto que necesitan ser eliminados. Ejecutar esto manualmente no es razonable. Intenté envolver el comando de eliminación en un script de bash. Al ejecutar rails c con el subcomando launcher app, la conexión a Redis falla:

/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.

Sin embargo, al comparar los entornos con export entre launcher enter app y launcher run app, parecen prácticamente idénticos. ¿Qué estoy pasando por alto? launcher run inicia en / mientras que launcher enter entra directamente en /var/www/discourse. Usar un cd antes de ejecutar rails no ayuda.

¿Alguna sugerencia? ¡Gracias!

Creo que docker run inicia un nuevo contenedor.

Para cosas así, uso docker exec en lugar de launcher, que realiza muchas acciones que no necesitas.

1 me gusta

Gracias por la respuesta. He notado que el comportamiento de Rails con docker exec también es muy extraño. Manualmente, funciona perfectamente:

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

Pero cuando intento ejecutar rails c desde fuera del contenedor, obtengo los siguientes problemas:

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

Pero lo más interesante es esto:

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

¿Por qué hay alguna diferencia en absoluto?

Esto es lo esperado; estás indicando a Docker que ejecute el binario /usr/local/bin/rails console en el contenedor. Es decir, un solo archivo con un espacio incrustado. Este archivo no existe.

Considera lo siguiente:

○ → 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 el comando de la misma manera que si lo ejecutaras desde dentro del contenedor:

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

Usando el ejemplo del autor original (OP), esto debería funcionar:

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

Está bien, fue inesperado para mí porque no leí el RTFM. Gracias por la ayuda rápida.

1 me gusta