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