Exécuter des commandes rails depuis Bash sur l'hôte

Bonjour à tous,

Je souhaite exécuter des tâches automatisées de nettoyage des utilisateurs depuis le Bash de l’hôte. Manuellement, j’exécute :

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

J’ai une longue liste de noms d’utilisateurs dans un fichier texte qui doivent être supprimés. L’exécution manuelle n’est pas raisonnable. J’ai essayé d’encapsuler la commande de suppression dans un script bash. Lors de l’exécution de rails c avec la sous-commande launcher app, la connexion Redis échoue :

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

Cependant, lorsque je compare les environnements avec export entre launcher enter app et launcher run app, ils semblent presque identiques. Qu’est-ce que je rate ? launcher run démarre dans / tandis que launcher enter entre directement dans /var/www/discourse. Utiliser un cd avant d’exécuter rails ne résout pas le problème.

Avez-vous des pistes ? Merci !

Je pense que docker run lance un nouveau conteneur.

Pour ce genre de choses, j’utilise docker exec plutôt que launcher, qui fait beaucoup de choses dont vous n’avez pas besoin.

1 « J'aime »

Merci pour votre réponse. Je constate que le comportement de Rails avec docker exec est également très étrange. Manuellement, cela fonctionne parfaitement :

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

Mais lorsque j’essaie d’exécuter rails c depuis l’extérieur du conteneur, je rencontre les problèmes suivants :

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

Mais ce qui est plus intéressant :

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

Pourquoi y a-t-il une différence ?

C’est normal ; vous demandez à Docker d’exécuter le binaire /usr/local/bin/rails console dans le conteneur. Autrement dit, un fichier unique contenant un espace intégré. Ce fichier n’existe pas.

Considérez l’exemple suivant :

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

Citez la commande de la même manière que si vous l’exécutiez à l’intérieur du conteneur :

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

En utilisant l’exemple de l’OP, cela devrait fonctionner :

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 « J'aime »

D’accord, c’était inattendu pour moi car je n’ai pas lu le RTFM. Merci pour votre aide rapide.

1 « J'aime »