حل مشاكل إذن Docker المرفوضة

تشغيل التطبيقات باستخدام Docker كروتين يومي يمكن أن يتحول إلى كابوس عند مواجهتك لخطأ مثل إذن Docker مرفوض أثناء المحاولة. ولكن لا تقلق، سيساعدك هذا المقال في العودة إلى التشغيل في وقت قصير.

في هذا البرنامج التعليمي، ستتعلم العديد من الطرق لحل رسالة خطأ إذن Docker المرفوضة.

المتطلبات المسبقة

يشمل هذا البرنامج التعليمي عروضًا توضيحية عملية. لمتابعة، تأكد من وجود ما يلي:

  • تعمل العروض في هذا البرنامج التعليمي على Ubuntu 20.04، ولكن توزيعات Linux الأخرى ستعمل أيضًا.
  • محرك Docker، مع تشغيل البرنامج التعليمي بالإصدار 20.10.8، بناء 3967b7d.

تشغيل أوامر Docker بامتياز

يمكن أن يؤدي العديد من العوامل إلى حدوث خطأ إذن مرفوض أثناء الاتصال بـ Docker. إحدى تلك العوامل هي أنه قد تكون تقوم بتشغيل أوامر Docker دون إضافة أمر sudo. أمر sudo هو الذي يمنحك حقوق الإدارة المرتفعة إلى جانب الامتيازات الأمانية عند تشغيل الأوامر.

أدناه، يمكنك رؤية خطأ إذن مرفوض المريع أثناء محاولة تشغيل أمر docker.

Running into a permission denied error

قم بتشغيل الطرفية الخاصة بك وأضف `sudo` قبل الأمر `docker` أدناه لتشغيل صورة Docker `hello-world`. نظرًا لأنك تقوم بتشغيل أمر مرتفع، ستحتاج إلى إدخال كلمة المرور الخاصة بك للمتابعة.

sudo docker run hello-world

سترى نتيجة مماثلة لتلك المُعروضة أدناه تشير إلى أن Docker مثبت بشكل صحيح.

Running Elevated (sudo) Docker Commands

إعادة تشغيل محرك Docker

إذا لم يحل تشغيل أوامر Docker المُرتفعة خطأ “الإذن مرفوض”، فتحقق من تشغيل محرك Docker الخاص بك. بالمثل، يؤدي إيقاف تشغيل محرك Docker إلى إثارة خطأ “الإذن مرفوض” مثل تشغيل أمر `docker` دون الأمر `sudo`. كيف تُصلح الخطأ؟ من خلال إعادة تشغيل محرك Docker الخاص بك.

قم بتشغيل الأمر systemctl أدناه لتأكيد حالة محرك Docker (`status docker`) وإذا كان يعمل.

sudo systemctl status docker

أدناه، يمكنك معرفة تشغيل محرك Docker من الحالة المُعادة التي تظهر `active (running)`.

Displaying Docker Engine status

إذا لم يكن محرك Docker نشطًا، قم بتشغيل الأمر `systemctl` أدناه لبدء محرك Docker (`start docker`).

sudo systemctl start docker

الآن، قم بتشغيل أمر الـ hello-world Docker كما فعلت في قسم “تشغيل أوامر Docker بصلاحيات مرتفعة” للتحقق من أن الخطأ قد تم حله.

sudo docker run hello-world

إضافة حساب المستخدم إلى مجموعة بصلاحيات الوصول للمستخدم غير الجذري

لقد قمت بتأكيد أن محرك Docker الخاص بك يعمل، ولكن لا تزال تواجه خطأ “permission denied” في Docker؟ إذا كان الأمر كذلك، فيجب عليك إضافة حساب المستخدم الخاص بك إلى مجموعة تمتلك صلاحيات وصول غير جذرية. لماذا؟ لأن أي أمر Docker تقوم بتشغيله على جهاز Linux غير موجود في مجموعة المستخدم يُثير خطأ “permission denied”.

  1. قم بتشغيل أمر groupadd أدناه لإنشاء مجموعة جديدة تسمى docker. أدخل كلمة المرور الخاصة بك لمتابعة تشغيل الأمر.
sudo groupadd docker

إذا كانت مجموعة docker موجودة في مجموعة المستخدم، سترى مخرجات مشابهة لتلك المعروضة أدناه.

Creating a New Group Named ‘docker’

2. بعد ذلك، قم بتشغيل أمر usermod أدناه حيث تُخبر خيارات -aG الأمر بإضافة حساب المستخدم الخاص بك (programmer) إلى مجموعة (docker). يؤدي هذا الأمر إلى منح حساب المستخدم الخاص بك وصولًا غير جذري.

sudo usermod -aG docker programmer

3. قم بتشغيل أمر newgrp أدناه لتغيير معرّف المجموعة الحقيقية الحالية إلى مجموعة docker.

قم بتشغيل هذا الأمر في كل مرة ترغب في تشغيل Docker كمستخدم غير جذري.

sudo newgrp docker 

4. أخيرًا ، قم بإعادة تشغيل صورة hello-world Docker للتحقق مما إذا كنت لا ترى الخطأ بعد الآن. إذا كنت لا تزال تحصل على خطأ في هذه المرحلة ، فقم بالنظر في منح المزيد من الوصول إلى ملف docker.sock. ملف docker.sock هو مأخذ UNIX ، وهو وسيلة لتبادل معلومات العملية بين المستخدم والنظام ، الذي يستمع إليه ديمون Docker كنقطة دخول لواجهة برمجة التطبيقات Docker.

قم بتشغيل أمر chmod أدناه لمنح جميع المستخدمين صلاحية القراءة/الكتابة (666) لملف /var/run/docker.sock. الآن قم بتشغيل صورة hello-world Docker مرة أخرى لرؤية ما إذا تم حل الخطأ.

sudo chmod 666 /var/run/docker.sock

تحرير ملف وحدة خدمة Docker

إذا كان تشغيل Docker كمستخدم غير جذر ليس كافيًا لإصلاح الخطأ ، جرب تحرير ملف وحدة خدمة Docker SystemD ، وهو نظام التحكم في الخدمة. يحتوي ملف الخدمة Docker على معلمات حساسة قد تغير سلوك ديمون Docker. يمكنك تعديل سلوك الوحدة Docker الافتراضي عن طريق إضافة أمر إضافي لتغيير سلوك الخدمة الافتراضي.

1. قم بتشغيل الأمر أدناه لفتح ملف وحدة خدمة Docker في محرر النص المفضل لديك. في هذا المثال ، يتم فتح ملف الخدمة Docker في محرر النانو للنص.

sudo nano /usr/lib/systemd/system/docker.service

2. تحديد المنطقة التي تحتوي على رأس [الخدمة] داخل ملف وحدة خدمة Docker، كما هو موضح أدناه. قم بنسخ/لصق الأوامر أدناه إلى ملف وحدة خدمة Docker واحفظ التغييرات.

أدناه، تعيّن الأمر SupplementaryGroups المجموعات اليونكس الإضافية إلى حيث يتم تنفيذ العمليات. في الوقت نفسه، يقوم الأمر ExecStartPost بتنظيف العمليات التي يتم تنفيذها حتى لو فشلت الخدمة في بدء التشغيل بشكل صحيح.

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
Editing the Docker Service Unit File

3. الآن، قم بتشغيل الأوامر أدناه لإعادة تشغيل وتمكين خدمة Docker. بذلك، يتيح لك بدء تشغيل خدمة Docker من جديد لتجنب الحصول على أخطاء عند تشغيل أوامر Docker.

# يعيد تحميل جميع ملفات وحدة Docker وإعادة إنشاء شجرة التبعية بأكملها.
sudo systemctl daemon-reload
# يعيد تشغيل خدمة Docker
sudo systemctl start docker
# يمكّن Docker من التشغيل على جهاز الكمبيوتر الخاص بك.
sudo systemctl enable docker

4. في النهاية، قم بتشغيل صورة Docker hello-world مرة أخرى وتحقق مما إذا كنت لا تزال تحصل على خطأ الإذن المرفوض.

تشغيل Docker في وضع الامتياز

وأخيرًا، في قائمة إصلاح خطأ رفض إذن Docker، هناك تشغيل Docker في وضع الامتياز. بفعل ذلك، يمنح وضع الامتياز لحاوية Docker الوصول الكامل إلى النظام.

تشغيل Docker في وضع الامتياز محفوف بالمخاطر وعرضة للهجمات من قبل القراصنة. لذا كن حذرًا وقم بتشغيل Docker في وضع الامتياز فقط عندما تعرف بالضبط ما تفعله.

1. قم بتشغيل الأمر أدناه لعرض جميع حاويات Docker في النظام الخاص بك، واحصل على معرف الحاوية التي تريد تشغيلها.

sudo docker ls -a
Listing all Docker Containers in the System

2. فيما بعد، قم بتشغيل الأمر docker inspect أدناه للتحقق مما إذا كانت الحاوية التي تريد تشغيلها قد تم تشغيلها بالفعل في وضع متطور (--format='{{.HostConfig.Privileged}}'). قم بتبديل CONTAINER_ID أدناه بمعرف الحاوية الفعلي الذي لاحظته في الخطوة الأولى.

docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID

إذا كانت الحاوية في وضع متطور، سيعيد الأمر قيمة true إلى واجهة الأوامر. ولكن إذا كان الأمر يعيد قيمة كاذبة، كما هو موضح أدناه، فانتقل إلى الخطوة التالية.

Checking if a Container is in Privileged Mode

3. أخيرًا، قم بتشغيل الأمر docker أدناه لتشغيل حاوية Docker بوضع متطور (--privileged hello-world).

sudo docker run --privileged hello-world

الختام

طوال هذا البرنامج التعليمي، لقد تعلمت العديد من الطرق لحل خطأ تصريح Docker permission denied، بدءًا من تشغيل الأوامر المرتفعة إلى تشغيل Docker في وضع متطور.

الآن تعرف كيفية التخلص من الخطأ عند بناء تطبيقات Docker؛ ربما ترغب أيضًا في الحفاظ على نظافة صور Docker الخاصة بك في جميع الأوقات؟

Source:
https://adamtheautomator.com/docker-permission-denied/