بعد الكثير من البحث والتجريب، تعلمت أن Docker Desktop على Linux هو سبب مشاكل الأذونات.
كما تعلم، يتم تشغيل تطبيق Discourse في حاوية Docker كمستخدم غير جذر، وهو المستخدم discourse. ولكن كما هو مكتوب على سبيل المثال هنا و هنا:
يعمل Docker Desktop على Linux على جهاز افتراضي وستعمل الحاويات داخل هذا الجهاز الافتراضي. في هذه الحالة، لا يمكنك ببساطة تحميل مجلد المضيف بنفس الطريقة في الحاويات، لأنك تحتاج إلى تحميله أولاً في الجهاز الافتراضي.
لذلك، كشخص ليس خبيرًا في Docker بأي حال من الأحوال، أرى طريقتين لمعالجة هذه المشكلة:
(1) التخلي عن Docker Desktop على Linux وتشغيل Docker أصليًا بدلاً من ذلك
يبدو هذا هو الحل الأكثر استدامة حيث أرى أن حاوية Discourse تبدو مصممة للاستخدام بهذه الطريقة. أنا متردد فقط لأنني سأضطر إلى تذكر جميع الأوامر لإدارة صوري وحاوياتي ومواردي. وبصفتي مطور واجهة أمامية، أفضل واجهة مستخدم لإدارة الأشياء. لكن أعتقد أنني يجب أن أتعامل مع هذا كاستثمار لتعلم المزيد عن Docker.
أو
(2) تغيير ملكية المجلدات المحملة في الحاوية
تمكنت من جعل هذا النهج يعمل وتشغيل Discourse بنجاح محليًا من Docker Desktop، ومع ذلك أرى الكثير من التحذيرات في Terminal ولذلك لست متأكدًا من مدى استدامة هذا الحل على المدى الطويل.
يتضمن هذا عدة خطوات:
الخطوة 1: استنساخ المستودع
$ git clone https://github.com/discourse/discourse.git
$ cd discourse
الخطوة 2: تهيئة الحاوية
من داخل مجلد discourse المستنسخ على الجهاز المضيف، قم بتنفيذ:
$ d/boot_dev
ماذا يفعل؟ انظر هنا.
هام: احذف العلامة --init حتى لا يتم فعل أي شيء بعد إنشاء الحاوية.
الخطوة 3: تغيير مالك المجلدات
المستخدم discourse داخل حاوية docker لديه المعرف 1000. يفترض هذا الدليل أن المستخدم الخاص بجهازك المضيف لديه نفس المعرف. قد لا يؤدي ذلك إلى تعطيل الأشياء إذا كان لدى المستخدم الخاص بجهازك المضيف معرف مختلف، ولكن لا يمكنني اختبار ذلك وبالتالي لا يمكنني التحدث عن هذا الموقف. يمكنك معرفة معرفك عن طريق تنفيذ id أو echo $UID في طرفية لينكس.
من جهازك المضيف، قم بتنفيذ:
# افتح طرفية في حاوية docker
$ d/shell
# يجب أن تكون بالفعل في /src، ولكن فقط للتأكد:
$ cd /src
# تغيير مالك /src إلى مستخدم ومجموعة discourse
$ chown 1000:1000 .
# تغيير مالك جميع الملفات والمجلدات داخل /src إلى مستخدم ومجموعة discourse (بشكل غير تكراري)
$ chown 1000:1000 *
# تغيير مالك جميع المجلدات الفرعية تقريبًا بشكل تكراري إلى مستخدم ومجموعة discourse
# أساسًا جميع المجلدات باستثناء 'database'، لأن هذا ينتمي إلى مستخدم ومجموعة 'postgres'
$ chown -R 1000:1000 app bin config d db docs documentation images lib log plugins public script spec test vendor
# التحقق من أن ذلك قد نجح، يجب أن يظهر مستخدم ومجموعة discourse الآن
$ ls -l
# اخرج من الحاوية
$ exit
الخطوة 4: المتابعة كالمعتاد
تابع إعداد الحاوية وبدء Discourse عن طريق تنفيذ ما يلي من جهازك المضيف:
# تثبيت gems
$ d/bundle install
# ترحيل قاعدة البيانات
$ d/rake db:migrate
$ RAILS_ENV=test d/rake db:migrate
# إنشاء مستخدم مسؤول
$ d/rake admin:create
# في طرفية واحدة:
d/rails s
# وفي طرفية منفصلة
d/ember-cli
ملاحظة:
واجهت بعض التحذيرات مثل هذه:
fatal: detected dubious ownership in repository at '/src'
والتي تأتي من شيء المحاكاة الافتراضية لـ Docker Desktop على Linux.
تجاهل هذه التحذيرات، من جهازك المضيف، قم بتنفيذ:
d/exec git config --global --add safe.directory /src
لماذا يعمل Docker Desktop لنظام Linux على جهاز افتراضي؟