في ترجمة الجزء الثالث من سلسلة Docker ، سنستمر في إلهامنا للمعجنات ، أي الخبز. سيكون موضوعنا الرئيسي اليوم هو العمل مع Dockerfiles. سنقوم بتحليل الإرشادات المستخدمة في هذه الملفات.
→
الجزء 1: الأساسيات→
الجزء 2: المصطلحات والمفاهيم→
الجزء 3: ملفات Dockerfile→
الجزء 4: تقليل حجم الصور وتسريع تجميعها→
الجزء 5: الفرق→
الجزء 6: العمل مع البياناتالخبز هي تعليمات في Dockerfile.صور عامل الميناء
تذكر أن حاوية Docker هي صورة Docker تم إحياءها. هذا نظام تشغيل قائم بذاته لا يوجد فيه سوى رمز التطبيق الأكثر ضرورة.
صور Docker هي نتيجة عملية الإنشاء ، وتقوم حاويات Docker بتشغيل الصور. في قلب Docker يوجد Dockerfiles. تخبر ملفات مثل هذا Docker كيفية تجميع الصور التي يتم إنشاء الحاويات منها.
تحتوي كل صورة Docker على ملف يسمى Dockerfile. هو مكتوب اسمه بهذه الطريقة - دون تمديد. عندما تقوم بتشغيل
docker build
لإنشاء صورة جديدة ، من المفترض أن Dockerfile موجود في دليل العمل الحالي. إذا كان هذا الملف موجودًا في مكان آخر ، فيمكن تحديد موقعه باستخدام علامة
-f
.
تتكون الحاويات ، كما اكتشفنا في المادة الأولى من هذه السلسلة ، من طبقات. كل طبقة ، باستثناء الطبقة الأخيرة ، التي تقع أعلى كل الطبقات الأخرى ، للقراءة فقط. يخبر Dockerfile نظام Docker بالطبقات وبأي ترتيب للإضافة إلى الصورة.
في الواقع ، كل طبقة هي مجرد ملف يصف التغيير في حالة الصورة مقارنة بالحالة التي كانت عليها بعد إضافة الطبقة السابقة. على نظام Unix ، بالمناسبة ، كل شيء تقريبًا هو
ملف .
الصورة الأساسية هي ما هي الطبقة المصدر (أو الطبقات) للصورة التي يتم إنشاؤها. تسمى الصورة الأساسية أيضًا الصورة الأصل.
الصورة الأساسية هي حيث تبدأ صورة Docker.عند تنزيل صورة من مستودع بعيد إلى كمبيوتر محلي ، يتم تنزيل الطبقات غير المتوفرة على هذا الكمبيوتر فعليًا فقط. يهدف Docker إلى توفير المساحة والوقت من خلال إعادة استخدام الطبقات الموجودة.
ملفات Dockerfile
تحتوي ملفات Dockerfiles على تعليمات لإنشاء صورة. في الحروف الكبيرة ، تبدأ أسطر هذا الملف. باتباع التعليمات هي حججهم. التعليمات ، عند بناء الصورة ، تتم معالجتها من أعلى إلى أسفل. إليك ما يبدو عليه:
FROM ubuntu:18.04 COPY . /app
يتم إنشاء الطبقات في الصورة النهائية فقط من خلال إرشادات
FROM
و
RUN
و
COPY
و
ADD
. تقوم الإرشادات الأخرى بإعداد شيء ما أو وصف البيانات الوصفية أو إخبار Docker أنك بحاجة إلى القيام بشيء ما أثناء تنفيذ الحاوية ، على سبيل المثال ، افتح بعض المنافذ أو قم بتشغيل أمر ما.
ننتقل هنا من الافتراض بأن صورة Docker تعتمد على نظام التشغيل Unix-like يتم استخدامه. بالطبع ، يمكنك هنا أيضًا استخدام صورة تستند إلى Windows ، ولكن استخدام Windows هو ممارسة أقل شيوعًا ، فالعمل مع هذه الصور يكون أكثر صعوبة. نتيجة لذلك ، إذا كانت لديك الفرصة ، استخدم Unix.
للبدء ، إليك قائمة بتعليمات Dockerfile مع تعليقات مختصرة.
عشرات Dockerfile تعليمات
FROM
- لتعيين الصورة الأساسية (الأصل).LABEL
- يصف البيانات الوصفية. على سبيل المثال ، معلومات حول من قام بإنشاء وصيانة الصورة.ENV
- يضبط متغيرات البيئة المستمرة.RUN
- ينفذ أمرًا وينشئ طبقة صورة. تستخدم لتثبيت الحزم في حاوية.COPY
- نسخ الملفات والمجلدات إلى الحاوية.ADD
- نسخ الملفات والمجلدات إلى حاوية ، يمكن فك ملفات .tar المحلية.CMD
- يصف أمرًا يحتوي على وسيطات يلزم تنفيذها عند تشغيل الحاوية. يمكن تجاوز الوسائط عند بدء تشغيل الحاوية. يمكن أن يحتوي الملف على تعليمة CMD
واحدة فقط.WORKDIR
- يعين دليل العمل للتعليمات التالية.ARG
- يضبط المتغيرات لتمرير Docker أثناء بناء الصورة.ENTRYPOINT
- يوفر أمرًا باستخدام الوسائط لاستدعاء أثناء تنفيذ الحاوية. لا يتم تجاوز الحجج.EXPOSE
- يشير إلى الحاجة إلى فتح المنفذ.VOLUME
- ينشئ نقطة تحميل للعمل مع التخزين المستمر.
الآن دعنا نتحدث عن هذه التعليمات.
تعليمات وأمثلة على استخدامها
ockSimple Dockerfile
Dockerfile يمكن أن تكون بسيطة وقصيرة للغاية. على سبيل المثال - مثل هذا:
FROM ubuntu:18.04
▍ من التعليمات
يجب أن يبدأ Dockerfile ببيان
FROM
، أو ببيان
ARG
متبوعًا ببيان
FROM
.
تخبر الكلمة الرئيسية
FROM Docker باستخدام صورة أساسية تتطابق مع الاسم والعلامة المقدمة عند إنشاء الصورة. الصورة الأساسية ، بالإضافة إلى ذلك ، تسمى أيضًا
الصورة الأصلية .
في هذا المثال ، يتم تخزين الصورة الأساسية في مستودع
أوبونتو . Ubuntu هو اسم مستودع Docker الرسمي ، والذي يوفر الإصدار الأساسي من عائلة Linux الشهيرة لأنظمة التشغيل المسماة Ubuntu.
يرجى ملاحظة أن Dockerfile في السؤال يتضمن علامة
18.04
التي تحدد الصورة الأساسية التي نحتاجها. هذه هي الصورة التي سيتم تحميلها عند بناء صورتنا. إذا لم يتم تضمين العلامة في التعليمات ، فسيستمر Docker في افتراض أن أحدث صورة من المستودع مطلوبة. للتعبير بوضوح عن نواياهم ، يوصى مؤلف Dockerfile بالإشارة إلى الصورة التي يحتاجها.
عند استخدام Dockerfile أعلاه على الجهاز المحلي لإنشاء الصورة لأول مرة ، سيقوم Docker بتحميل الطبقات المحددة بواسطة صورة
ubuntu
. يمكن تخيلها متراكبة على بعضها البعض. كل طبقة تالية هي ملف يصف الاختلافات في الصورة مقارنةً بالحالة التي كانت عليها بعد إضافة الطبقة السابقة إليها.
عندما تقوم بإنشاء حاوية ، تتم إضافة طبقة يمكنك من خلالها إجراء تغييرات فوق جميع الطبقات الأخرى. لا يمكن قراءة البيانات في الطبقات المتبقية إلا.
هيكل الحاوية (مأخوذ من الوثائق )يستخدم Docker ، من أجل الكفاءة ، استراتيجية النسخ عند الكتابة. إذا كانت الطبقة الموجودة في الصورة موجودة في المستوى السابق وتحتاج بعض الطبقات إلى قراءة البيانات منها ، فسيستخدم Docker الملف الموجود. لا تحتاج إلى تنزيل أي شيء.
عندما يتم تنفيذ الصورة ، إذا كانت الطبقة تحتاج إلى تعديل عن طريق الحاوية ، فسيتم نسخ الملف المقابل إلى أعلى طبقة قابلة للتغيير. لمعرفة المزيد حول استراتيجية النسخ عند الكتابة ، ألق نظرة على
هذه المادة من وثائق Docker.
نواصل مناقشة التعليمات المستخدمة في Dockerfile ، مع إعطاء مثال لمثل هذا الملف مع بنية أكثر تعقيدا.
▍ أكثر dockerfile متطورة
على الرغم من أن Dockerfile التي استعرضناها للتو كانت نظيفة ومفهومة ، إلا أنها بسيطة للغاية ، فهي تستخدم تعليمة واحدة فقط. بالإضافة إلى ذلك ، لا توجد تعليمات يتم الاحتجاج بها أثناء تنفيذ الحاوية. ألقِ نظرة على ملف آخر يجمع صورة صغيرة. لديها آليات تحدد الأوامر التي يتم استدعاؤها أثناء تنفيذ الحاوية.
FROM python:3.7.2-alpine3.8 LABEL maintainer="jeffmshale@gmail.com" ENV ADMIN="jeff" RUN apk update && apk upgrade && apk add bash COPY . ./app ADD https://raw.githubusercontent.com/discdiver/pachy-vid/master/sample_vids/vid1.mp4 \ /my_app_directory RUN ["mkdir", "/a_directory"] CMD ["python", "./my_script.py"]
ربما للوهلة الأولى قد يبدو هذا الملف معقدًا إلى حد ما. لذلك ، دعونا نتعامل معه.
قاعدة هذه الصورة هي صورة بيثون الرسمية مع علامة 3.7.2-alpine3.8. بعد تحليل
هذه الشفرة ، يمكنك أن ترى أن هذه الصورة الأساسية تشمل Linux و Python ، وبشكل عام ، يقتصر هذا على تكوينها. تحظى صور Alpine OS بشعبية كبيرة في عالم Docker. حقيقة أنها صغيرة في الحجم والسرعة العالية والسلامة. ومع ذلك ، لا تختلف صور جبال الألب في الإمكانيات الواسعة النموذجية لأنظمة التشغيل التقليدية. لذلك ، من أجل جمع شيء مفيد على أساس مثل هذه الصورة ، يحتاج منشئ الصورة إلى تثبيت الحزم التي يحتاجها.
L تعليمات LABEL
العلاماتتسمح لك
العبارة LABEL (التسمية) بإضافة بيانات التعريف إلى الصورة. في حالة الملف قيد الدراسة الآن ، يتضمن معلومات الاتصال الخاصة بمنشئ الصورة. التصريح تسميات لا تبطئ عملية تجميع الصورة أو زيادة حجمها. تحتوي فقط على معلومات مفيدة حول صورة Docker ، لذلك يوصى بإدراجها في الملف. يمكن العثور على تفاصيل حول العمل مع البيانات الوصفية في Dockerfile
هنا .
تعليمات INV
البيئةتسمح لك تعليمات
ENV بتعيين متغيرات البيئة الثابتة التي ستكون متاحة في الحاوية أثناء تنفيذه. في المثال السابق ، بعد إنشاء الحاوية ، يمكنك استخدام متغير
ADMIN
.
إن تعليمات
ENV
مناسبة تمامًا لإعداد الثوابت. إذا كنت تستخدم قيمة معينة في Dockerfile عدة مرات ، على سبيل المثال ، عند وصف الأوامر التي تعمل في الحاوية ، وتشك في أنه قد تضطر في يوم ما إلى تغييرها إلى أخرى ، فمن المنطقي أن تكتبها إلى ثابت مماثل.
تجدر الإشارة إلى أنه في ملفات Dockerfile غالبًا ما توجد طرق مختلفة لحل المشكلات نفسها. ما يجب استخدامه بالضبط هو السؤال الذي يتأثر قراره بالرغبة في الامتثال لأساليب العمل المعتمدة في بيئة Docker ، لضمان شفافية الحل وأدائه العالي. على سبيل المثال ، تخدم
ENTRYPOINT
RUN
و
CMD
و
ENTRYPOINT
أغراض مختلفة ، لكن يتم استخدامها جميعًا لتنفيذ الأوامر.
تعليمات UNRUN
تعليمات التشغيليسمح لك تعليمة
RUN بإنشاء طبقة أثناء إنشاء الصورة. بعد تنفيذه ، تتم إضافة طبقة جديدة إلى الصورة ، وحالتها ثابتة. غالبًا ما يتم استخدام تعليمات
RUN
لتثبيت حزم إضافية في الصور. في المثال السابق ، يخبر بيان
RUN apk update && apk upgrade
Docker أن النظام يحتاج إلى تحديث الحزم من الصورة الأساسية. باتباع هذين الأمرين ، يكون الأمر
&& apk add bash
، يشير إلى أن bash يجب تثبيته في الصورة.
ما يشبه
apk
في الفرق هو اختصار
لمدير حزمة Alpine Linux . إذا كنت تستخدم الصورة الأساسية لبعض أنظمة تشغيل Linux الأخرى ، فعلى سبيل المثال ، عند استخدام Ubuntu ، قد تحتاج إلى أمر من النموذج
RUN apt-get
لتثبيت الحزم. سنتحدث لاحقًا عن طرق أخرى لتثبيت الحزم.
يمكن استخدام تعليمات
RUN
والتعليمات المماثلة ، مثل
CMD
و
ENTRYPOINT
، إما في نموذج exec أو في نموذج shell. يستخدم نموذج exec بناء جملة يشبه وصف صفيف JSON. على سبيل المثال ، قد يبدو كالتالي:
RUN ["my_executable", "my_first_param1", "my_second_param2"]
.
في المثال السابق ، استخدمنا نموذج shell لتعليمات RUN كما يلي:
RUN apk update && apk upgrade && apk add bash
.
في وقت لاحق في Dockerfile ، استخدمنا نموذج exec لتعليمات
RUN
، في شكل
RUN ["mkdir", "/a_directory"]
لإنشاء دليل. في الوقت نفسه ، باستخدام التعليمات الواردة في هذا النموذج ، عليك أن تتذكر الحاجة إلى تنسيق السلاسل بعلامات اقتباس مزدوجة ، كما هو معتاد في تنسيق JSON.
COP نسخة التعليمات
نسخة COPYيتم تقديم تعليمات
COPY في ملفنا مثل هذا:
COPY . ./app
COPY . ./app
. أخبرت Docker أنها تحتاج إلى أخذ الملفات والمجلدات من السياق المحلي للتجميع وإضافتها إلى دليل العمل الحالي للصورة. إذا كان الدليل الوجهة غير موجود ، فستنشئ هذه التعليمات.
AD تعليمات إضافة
تسمح لك تعليمات
ADD بحل نفس المشكلات التي تواجه
COPY
، لكن هناك
COPY
استخدام أخرى مرتبطة بها. لذلك ، باستخدام هذا الإرشادات ، يمكنك إضافة ملفات تم تنزيلها من مصادر بعيدة إلى الحاوية ، بالإضافة إلى فك ملفات .tar المحلية.
في هذا المثال ، تم استخدام تعليمة
ADD
لنسخ ملف يمكن الوصول إليه من URL إلى
my_app_directory
حاوية
my_app_directory
. ومع ذلك ، تجدر الإشارة إلى أن
وثائق Docker لا توصي باستخدام هذه الملفات التي تم الحصول عليها عن طريق URL ، حيث لا يمكن حذفها ، وبما أنها تزيد من حجم الصورة.
بالإضافة إلى ذلك ، تقترح
الوثائق ، كلما كان ذلك ممكنًا ، استخدام عبارة
COPY
بدلاً من عبارة
ADD
لجعل Dockerfile أسهل في الفهم. أعتقد أن فريق تطوير Docker يجب أن يجمع بين
ADD
و
COPY
في تعليمة واحدة حتى لا يضطر أولئك الذين ينشئون الصور إلى تذكر الكثير من التعليمات.
لاحظ أن عبارة
ADD
تحتوي على حرف فاصل الأسطر -
\
. يتم استخدام هذه الأحرف لتحسين إمكانية قراءة الأوامر الطويلة عن طريق تقسيمها إلى عدة أسطر.
▍ تعليمات CMD
تعليمات CMDيوفر تعليمة
CMD Docker أمرًا للتنفيذ عند بدء تشغيل الحاوية. لا تتم إضافة نتائج هذا الأمر إلى الصورة أثناء التجميع. في مثالنا ، يقوم هذا الأمر بتشغيل البرنامج النصي
my_script.py
في وقت التشغيل.
إليك شيء آخر تحتاج إلى معرفته حول تعليمات
CMD
:
- تعليمات
CMD
واحدة فقط يمكن أن تكون موجودة في Dockerfile واحد. إذا كان هناك العديد من هذه التعليمات في الملف ، فسيتجاهل النظام كل شيء باستثناء آخر. - قد يكون لتعليمات
CMD
نموذج exec. إذا لم تتضمن التعليمات المرجع إلى الملف القابل للتنفيذ ، ENTRYPOINT
أن تكون تعليمات ENTRYPOINT
موجودة في الملف. في هذه الحالة ، يجب أن يكون كلا الإرشادات JSON
. - تجاوز وسيطات سطر الأوامر التي تم تمريرها إلى
docker run
الوسائط التي توفرها عبارة CMD
في Dockerfile.
D في Dockerfile أكثر تعقيدا
النظر في Dockerfile آخر ، والتي سيتم استخدام بعض الأوامر الجديدة.
FROM python:3.7.2-alpine3.8 LABEL maintainer="jeffmshale@gmail.com" # RUN apk add --update git # WORKDIR /usr/src/my_app_directory # COPY . . # ARG my_var=my_default_value # , ENTRYPOINT ["python", "./app/my_script.py", "my_var"] # EXPOSE 8000 # VOLUME /my_volume
في هذا المثال ، من بين أشياء أخرى ، يمكنك رؤية التعليقات التي تبدأ بـ
#
character.
أحد الأشياء الرئيسية التي يقوم بها Dockerfile هو تثبيت الحزم. كما ذكرنا سابقًا ، هناك طرق عديدة لتثبيت الحزم باستخدام تعليمة
RUN
.
يمكن تثبيت الحزم في صورة Alpine Docker باستخدام
apk
. لهذا ، كما قلنا بالفعل ، يتم استخدام أمر من النموذج
RUN apk update && apk upgrade && apk add bash
.
بالإضافة إلى ذلك ، يمكن تثبيت حزم Python في الصورة باستخدام
نقطة ،
عجلة ، وكوندا . إذا لم نتحدث عن Python ، ولكن عن لغات البرمجة الأخرى ، يمكن استخدام مديري الحزم الآخرين لإعداد الصور المقابلة.
في نفس الوقت ، لكي يكون التثبيت ممكنًا ، يجب أن تزود الطبقة الأساسية مدير الحزمة بمدير حزمة مناسب. لذلك ، إذا واجهت مشاكل أثناء تثبيت الحزم ، فتأكد من تثبيت مدير الحزم قبل محاولة استخدامها.
على سبيل المثال ، يمكن استخدام عبارة
RUN
في Dockerfile لتعيين قائمة الحزم باستخدام
pip
. إذا قمت بذلك ، فقم بدمج كل الأوامر في تعليمة واحدة وفصلها بحرف فاصل أسطر باستخدام
\
character. بفضل هذا النهج ، ستبدو الملفات أنيقة وسيؤدي ذلك إلى إضافة طبقات أقل للصورة من التي ستتم إضافتها باستخدام عدة تعليمات
RUN
.
بالإضافة إلى ذلك ، يمكنك القيام بأشياء مختلفة لتثبيت حزم متعددة. يمكنك سردهم في ملف ونقل هذا الملف إلى مدير الحزم باستخدام
RUN
. عادةً ما تسمى هذه الملفات
requirements.txt
.
▍ تعليمات العمل
الدلائل العاملةيسمح
لك تعليمة
WORKDIR بتغيير دليل عمل الحاوية.
ENTRYPOINT
COPY
و
ADD
و
RUN
و
CMD
و
ENTRYPOINT
التي تتبع
WORKDIR
تعمل مع هذا الدليل. فيما يلي بعض الميزات المتعلقة بهذه التعليمات:
- من الأفضل تعيين المسارات المطلقة إلى المجلدات مع
WORKDIR
بدلاً من التنقل في نظام الملفات باستخدام أوامر cd
في Dockerfile. - ينشئ تعليمات
WORKDIR
دليلًا تلقائيًا في حالة عدم وجوده. - يمكنك استخدام عدة تعليمات
WORKDIR
. إذا تم توفير إرشادات نسبية لمثل هذه الإرشادات ، فسيغير كل منها دليل العمل الحالي.
uGuide ARG
يسمح لك تعليمة
ARG بتعيين متغير يمكن تمرير قيمته من سطر الأوامر إلى الصورة أثناء التجميع. يمكن تمثيل قيمة المتغير الافتراضي في Dockerfile. على سبيل المثال:
ARG my_var=my_default_value
.
بخلاف متغيرات
ENV
، لا تتوفر متغيرات
ARG
في وقت التشغيل. ومع ذلك ، يمكن استخدام متغيرات
ARG
لتعيين القيم الافتراضية لمتغيرات
ENV
من سطر الأوامر أثناء بناء الصورة. وستتوفر متغيرات
ENV
بالفعل في الحاوية أثناء تنفيذها. يمكن العثور
هنا على تفاصيل حول أسلوب العمل مع المتغيرات.
EN مدخل التعليمات
نقطة الانتقال إلى مكان ماتسمح
لك عبارة ENTRYPOINT بتحديد أمر باستخدام الوسائط التي يجب تنفيذها عند بدء تشغيل الحاوية. يشبه الأمر
CMD
، ولكن لا يتم استبدال المعلمات المحددة في
ENTRYPOINT
إذا تم تشغيل الحاوية مع معلمات سطر الأوامر.
بدلاً من ذلك ، تتم إضافة وسيطات سطر الأوامر التي تم تمريرها في إنشاءات
docker run my_image_name
النموذج
docker run my_image_name
إلى الوسائط المحددة بواسطة
ENTRYPOINT
. على سبيل المثال ، بعد تنفيذ أمر
docker run my_image bash
النموذج ، قم
docker run my_image bash
ستتم إضافة وسيطة
docker run my_image bash
إلى نهاية قائمة الوسائط المحددة بواسطة
ENTRYPOINT
. عند إعداد Dockerfile ، لا تنس
ENTRYPOINT
CMD
أو
ENTRYPOINT
.
هناك العديد من التوصيات في وثائق Docker فيما يتعلق بالتعليمات ،
CMD
أو
ENTRYPOINT
، التي ينبغي اختيارها كأداة لتنفيذ الأوامر عند بدء تشغيل الحاوية:
- إذا كنت بحاجة إلى تشغيل نفس الأمر في كل مرة تبدأ فيها تشغيل الحاوية ، فاستخدم
ENTRYPOINT
. - إذا تم استخدام الحاوية كتطبيق ، فاستخدم
ENTRYPOINT
. - إذا كنت تعلم أنه عند بدء تشغيل الحاوية ، فإنك تحتاج إلى تمرير الوسائط إليها التي يمكنها الكتابة فوق الوسائط المحددة في Dockerfile ، استخدم
CMD
.
في مثالنا ، يؤدي استخدام تعليمة
ENTRYPOINT ["python", "my_script.py", "my_var"]
إلى الحاوية ، عند بدء تشغيلها ، لتشغيل البرنامج النصي Python
my_script.py
باستخدام الوسيطة
my_var
. يمكن بعد ذلك استخدام القيمة التي يمثلها
my_var
في البرنامج النصي باستخدام
argparse . , Dockerfile
my_var
, ,
ARG
. , , .
Docker exec-
ENTRYPOINT
:
ENTRYPOINT ["executable", "param1", "param2"]
.
▍ EXPOSE
EXPOSEEXPOSE , , . . , , , , , , .
( ) ,
docker run
-p
.
-P
(
P
), ,
EXPOSE
.
▍ VOLUME
VOLUMEVOLUME , . .
ملخص
, Dockerfile. . , ,
USER
,
ONBUILD
,
STOPSIGNAL
,
SHELL
HEALTHCHECK
.
Dockerfile.
, Dockerfile — Docker, , . , .
أعزائي القراء! Docker , , Docker-.
