Rails-Befehle vom Host-Bash ausführen

Hallo zusammen,

ich möchte automatisierte Aufgaben zur Bereinigung von Benutzern vom Host-Bash aus ausführen. Manuell führe ich folgendes aus:

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

Ich habe eine lange Liste von Benutzernamen aus einer Textdatei, die entfernt werden müssen. Die manuelle Ausführung ist nicht praktikabel. Ich habe versucht, den Löschbefehl in ein Bash-Skript zu verpacken. Bei der Ausführung von rails c mit dem Unterbefehl launcher app schlägt die Redis-Verbindung fehl:

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

Beim Vergleich der Umgebungen mit export zwischen launcher enter app und launcher run app sehen diese jedoch fast identisch aus. Was übersehe ich? launcher run startet in /, während launcher enter direkt in /var/www/discourse wechselt. Ein cd vor der Ausführung von rails hilft nicht.

Irgendwelche Hinweise? Danke!

Ich denke, docker run startet einen neuen Container.

Für solche Fälle verwende ich docker exec statt launcher, der eine Menge Dinge macht, die du nicht brauchst.

Danke für die Antwort. Ich finde das Verhalten von Rails mit docker exec ebenfalls sehr seltsam. Manuell funktioniert es einwandfrei:

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

Wenn ich jedoch versuche, rails c von außerhalb des Containers auszuführen, erhalte ich folgende Fehler:

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

Noch interessanter:

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

Warum ist das überhaupt anders?

Dies ist zu erwarten; Sie weisen Docker an, die Datei /usr/local/bin/rails console im Container auszuführen. Das heißt, eine einzelne Datei mit einem eingebetteten Leerzeichen. Diese Datei existiert nicht.

Betrachten Sie folgendes Beispiel:

○ → 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 

Quoten Sie den Befehl genauso, als würden Sie ihn innerhalb des Containers ausführen:

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

Unter Verwendung des Beispiels aus dem Originalbeitrag sollte dies funktionieren:

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

Okay, das war für mich unerwartet, weil ich nicht RTFM gelesen habe. Danke für die schnelle Hilfe.