English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dockerfile هو ملف نصي يستخدم لبناء الصور، يحتوي النص على أوامر وشرح مطلوب لبناء الصور.
سأشرح لك كيفية تشغيل ملف Dockerfile لتحديد صورة، والتفاصيل الفنية للمسائل في ملف Dockerfile ستكون في الفصل التالي، يمكنك فقط معرفة عملية البناء.
1- سأشرح لك كيفية تحديد صورة nginx (سيتضمن الملف المبني /usr/share/nginx/html/index.html ملف)
في مجلد فارغ، أنشئ ملفًا يحمل الاسم Dockerfile، ثم أضف إلى الملف ما يلي:
FROM nginx RUN echo 'هذا هو صورة nginx المحلية المبنيه' > /usr/share/nginx/html/index.html
2، وظائف أوامر FROM و RUN
FROM:تكون الصور المخصصة مبنية على صورة FROM، هنا nginx هي الصورة الأساسية التي نحتاج إلى تحسينها. كل عملية التالية تعتمد على nginx.
RUN:يستخدم لتنفيذ الأوامر السطرية التي تتبعها. هناك نمطان:
نمط shell:
RUN <أمر سطر الأوامر> # <أمر سطر الأوامر> تساوي أمر، يتم تنفيذه في النهاية، أمر shell في الطرفية.
نمط exec:
RUN ["ملف القابل للتنفيذ", "الخيار1", "الخيار2"] # على سبيل المثال: # RUN ["./test.php", "dev", "offline"] تساوي RUN ./test.php dev offline
注意:تعني أوامر Dockerfile عند تنفيذها مرة واحدة أن كل طبقة جديدة يتم إنشاؤها في Docker. لذلك، يمكن أن يؤدي الطبقات غير الضرورية إلى تضخيم حجم الصورة بشكل كبير. على سبيل المثال:
FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz سيؤدي التنفيذ أعلاه إلى إنشاء 3 طبقات من الصور. يمكن تبسيط هذا النموذج إلى الشكل التالي: FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz
كما هو موضح أعلاه، يتم ربط الأوامر باستخدام الرمز &&، مما يؤدي إلى إنشاء صورة واحدة فقط.
في دليل ملف Dockerfile، يتم تنفيذ عملية البناء.
في المثال التالي، يتم بناء nginx:v3 (اسم الصورة: علامة الصورة) من خلال ملف Dockerfile في الدليل.
ملاحظة: النقطة الأخيرة . تمثل المسار الحالي للتنفيذ، سيتم شرح ذلك في الفصل التالي.
$ docker build -t nginx:v3 .
بما أن العرض أعلاه يوضح أن عملية البناء قد تمت بنجاح.
في الفصل السابق، تم ذكر أن النقطة الأخيرة . هي مسار السياق، إذن ما هو مسار السياق؟
$ docker build -t nginx:v3 .
مسار السياق، يشير إلى أن Docker يستخدم لإنشاء صورة المirror، أحياناً نريد استخدام ملفات الحاسوب المحلي (مثل النسخ)، يتعرف الأمر build على هذا المسار، ويقوم بحزم جميع محتويات المسار.
تحليلبسبب نموذج تشغيل docker هو C/S. نحن نحن C، محرك docker هو S. يتم إكمال عملية البناء في محرك docker، لذا لا يمكن استخدام ملفات جهازنا المحلي في هذه اللحظة. لذا يجب أن نضع ملفات المجلد المحدد في جهازنا المحلي معًا ونقدمها لـ docker engine للاستخدام.
إذا لم يُذكر آخر معامل، فإن مسار السياق الافتراضي هو موقع Dockerfile.
注意لا تحتوي على ملفات غير ضرورية في مسار السياق، لأنها يتم إرسالها إلى محرك docker معًا، وإذا كان هناك الكثير من الملفات، قد يؤدي ذلك إلى تبطيء العملية.
أمر النسخ، ينسخ الملف أو الدليل من مجلد السياق إلى المسار المحدد في وعاء التشغيل.
التنسيق:
COPY [--chown=<user>:<group>] <مسار المصدر1>... <مسار الهدف> COPY [--chown=<user>:<group>] ["<مسار المصدر1>",... "<مسار الهدف>"]
[--chown=<user>:<group>]معاملات اختيارية، يمكن للمستخدم تغيير مالك و组成员ة الملفات التي يتم نسخها إلى داخل وعاء التشغيل.
<مسار المصدر>الملف أو الدليل المصدر، يمكن أن يكون هنا تعبيرًا باستخدام Wildcard، يجب أن يكون قواعد Wildcard تلبية قواعد filepath.Match في Go. على سبيل المثال:
COPY hom* /mydir/ COPY hom?.txt /mydir/
<مسار الهدف>الطريق في وعاء التشغيل المحدد، لا تحتاج إلى إنشاء هذا المسار مسبقًا، إذا لم يكن المسار موجودًا، يتم إنشاؤه تلقائيًا.
استخدام الأمر ADD وCOPY يتم بنفس الشكل (يُنصح باستخدام COPY في نفس الحاجة). الفرق بينهما كالتالي:
مزايا ADD: إذا كان <ملف المصدر> ملف مضغوط tar، فإن تنسيق الضغط يكون gzip، bzip2، أو xz، فإنه يتم نسخه وتفريغه تلقائيًا إلى <مسار الهدف>.
عيوب ADD: لا يمكن نسخ ملفات tar المضغوطة دون تفريغها. قد يؤدي ذلك إلى فشل مخزن缓存 بناء الصورة، مما قد يؤدي إلى تبطيء عملية بناء الصورة. يمكن اتخاذ القرار حول استخدامها بناءً على الحاجة إلى تفريغ تلقائي.
مثل الأمر RUN، يستخدم لتشغيل البرامج، ولكن وقت تشغيلهما مختلف:
CMD تشغله عند تشغيل docker run.
RUN هو أثناء بناء docker.
دورتحديد البرنامج الذي يجب تشغيله في وعاء التشغيل، عند انتهاء تشغيل البرنامج، ينتهي وعاء التشغيل أيضًا. يمكن تغطية البرنامج المحدد بواسطة الأمر CMD باستخدام معاملات الأمر docker run.
注意إذا كان هناك أكثر من أوامر CMD في Dockerfile، فإن الأمر الأخير فقط يكون نافذًا.
التنسيق:
CMD <shell 命令> CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
التنسيق:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参
1、不传参运行
$ docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行
$ docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
التنسيق:
ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...
إليك مثال على إعداد NODE_VERSION = 7.2.0، يمكنك استخدام $NODE_VERSION في الأوامر التالية:
ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
معامل بناء، يعمل بنفس الطريقة مثل ENV. ولكن النطاق مختلف. المعاملات البيئية التي يتم تعيينها بواسطة ARG تعمل فقط داخل Dockerfile، أي أنها تعمل فقط أثناء عملية بناء الصورة، وليس موجودًا في الصورة التي تم بناؤها.
يمكن استخدام --build-arg <اسم المعامل>=<قيمة> في أمر بناء الصورة docker build لتحويل المعامل.
التنسيق:
ARG <اسم المعامل>[=<قيمة افتراضية>]
تحديد مجلد بيانات مجهول. إذا نسيت تثبيت مجلد البيانات عند بدء تشغيل الصندوق، سيتم تثبيت مجلد البيانات تلقائيًا على مجلد بيانات مجهول.
الوظيفة:
لمنع فقدان البيانات المهمة بسبب إعادة تشغيل الصندوق، وهو أمر شديد الخطورة.
لمنع زيادة حجم الصندوق.
التنسيق:
VOLUME ["<مسار1>", "<مسار2>"...] VOLUME <مسار>
عند بدء تشغيل الصندوق docker run، يمكننا تعديل نقطة الاتصال باستخدام معامل -v.
فقط الإعلان عن المنفذ.
الوظيفة:
لإعطاء فهم للمستخدم للمنفذ المُنظم للصورة، مما يساعد في تكوين الت映射.
عند استخدام ت映射 منفذ عشوائي أثناء تشغيل الصورة، أي docker run -P، سيتم ت映射 المنفذ المُعرض EXPOSE تلقائيًا.
التنسيق:
EXPOSE <منفذ1> [<منفذ2>...]
تحديد الدليل العمل. الدليل الذي تم تحديده باستخدام WORKDIR سيكون موجودًا في كل طبقة من طبقات بناء الصورة. (يجب أن يكون الدليل الذي تم تحديده باستخدام WORKDIR مسبقًا مُنشأً).
في عملية بناء الصورة الخاصة بـ docker build، كل أمر RUN هو طبقة جديدة. فقط الدلائل المُنشأة باستخدام WORKDIR ستكون موجودة دائمًا.
التنسيق:
WORKDIR <مسار الدليل العمل>
يُستخدم لتحديد المستخدم والمجموعة المستخدمة لتنفيذ الأوامر التالية، هنا فقط التبديل إلى مستخدم تنفيذ الأوامر التالية (يجب أن تكون المستخدم والمجموعة موجودة مسبقًا).
التنسيق:
USER <اسم المستخدم>[:<اسم المجموعة>]
يستخدم لتحديد برنامج أو أمر لمراقبة حالة تشغيل خدمة صناديق Docker
التنسيق:
HEALTHCHECK [خيارات] CMD <أمر>:يُستخدم لضبط أمر فحص حالة الصحة للصندوق HEALTHCHECK NONE: إذا كانت لدي الصورة الأساسية أوامر فحص الصحة، يمكن استخدام هذا السطر لإخفاء أوامر الفحص الصحة HEALTHCHECK [خيارات] CMD <أمر> : يستخدم أمر CMD الذي يتبعه CMD. يمكن الاستعانة باستخدام طريقة استخدام CMD.
يستخدم لتحديد أوامر بناء لتأخير تنفيذها. ببساطة، فإن الأوامر التي تحدد ONBUILD في Dockerfile لن تنفذ أثناء عملية بناء الصورة (افتراضًا أن الصورة هي test-build). عندما يستخدم Dockerfile جديد صورة تم بناؤها مسبقًا باستخدام FROM test-build، فإنه عند بناء صورة جديدة باستخدام Dockerfile الجديد، سيتم تنفيذ الأوامر المحددة ONBUILD في Dockerfile test-build.
التنسيق:
ONBUILD <أوامر أخرى>