تنفيذ أوامر rails من Bash المضيف

مرحباً بالجميع،

أريد تنفيذ مهام تنظيف تلقائية للمستخدمين من سطر أوامر Bash المضيف. يدوياً، أقوم بتشغيل

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

لدي قائمة طويلة بأسماء المستخدمين من ملف نصي يجب إزالتها. تنفيذ ذلك يدوياً غير عملي. حاولت تغليف أمر الحذف في سكريبت Bash. عند تنفيذ rails c باستخدام الأمر الفرعي launcher app، يفشل الاتصال بقاعدة بيانات Redis:

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

ومع ذلك، عند مقارنة البيئات باستخدام export بين launcher enter app و launcher run app، تبدو متطابقة إلى حد كبير. ما الذي أغفله؟ يبدأ launcher run في / بينما يدخل launcher enter مباشرة إلى /var/www/discourse. استخدام cd قبل تنفيذ rails لا يفيد.

أي تلميحات؟ شكراً!

أعتقد أن أمر docker run يشغل حاوية جديدة.

بالنسبة لمثل هذه الحالات، أستخدم docker exec بدلاً من launcher، الذي يقوم بالعديد من الأشياء التي لا تحتاجها.

إعجاب واحد (1)

شكرًا لك على الرد. أجد أن سلوك rails مع docker exec غريب أيضًا. يدويًا، يعمل بشكل مثالي:

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

لكن عندما أحاول تنفيذ rails c من خارج الحاوية، أواجه المشاكل التالية:

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

ولكن الأهم من ذلك:

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

لماذا يختلف هذا الأمر تمامًا؟

هذا متوقع؛ فأنت تخبر Docker بتنفيذ الملف الثنائي /usr/local/bin/rails console داخل الحاوية. أي ملف واحد يحتوي على مسافة مدمجة. هذا الملف غير موجود.

فكر في المثال التالي:

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

أقِمْ الأمر بنفس الطريقة كما لو كنت تنفذه من داخل الحاوية:

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

باستخدام المثال من المنشور الأصلي (OP)، يجب أن يعمل هذا:

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)

حسناً، كان الأمر غير متوقع بالنسبة لي لأنني لم أقرأ دليل المستخدم. شكراً على المساعدة السريعة.

إعجاب واحد (1)