عامل الميناء: نصائح سيئة


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


تقرأ "النصيحة السيئة" للأطفال من قِبل غريغوري أوستر ، وترى كم هو سهل وطبيعي أنه لا يمكن القيام بذلك.


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


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


إنشاء Dockerfile ، المشؤومة والرهيبة


بيتر (كبير مطوري جافا / روبي / php): الزميل فاسيلي ، هل قمت بالفعل بتحميل وحدة نمطية جديدة إلى Docker؟
باسل (المبتدئين): لا ، لم أفعل ، لا يمكنني معرفة ذلك مع عامل الميناء هذا. الكثير من المقالات حول ذلك ، عيني عريضة.


بيتر: حصلنا على موعد نهائي قبل عام. دعنا نساعد ، سنكتشفها في هذه العملية. قل لي ما لا يمكنك القيام به هناك.


باسل: لا يمكنني اختيار الصورة الأساسية بحيث تكون ضئيلة ، ولكن كان هناك كل ما هو مطلوب.
بيتر: خذ صورة أوبونتو ، لديه كل ما تحتاجه. وما الكثير من الفائض ، ثم سوف يأتي في متناول اليدين. ولا تنسَ أن تضع أحدث علامة حتى يكون الإصدار دائمًا هو الأحدث.


وفي Dockerfile ، يظهر السطر الأول:


FROM ubuntu:latest 

بيتر: ما هو التالي ، ماذا نكتب على وحدة لدينا؟
باسل: لذا روبي ، يجب أن يبدأ خادم ويب واثنين من شياطين الخدمة.
بيتر: نعم ، ما الذي نحتاجه: الياقوت ، المجمد ، العقيدات ، imagemagick فماذا ... وفي الوقت نفسه ، قم بالترقية للحصول على حزم جديدة بالتأكيد.
باسل: ونحن لن نخلق المستخدم ، حتى لا من الجذر؟
بيتر: حسنًا ، لا يزال يخدع بالحق.
فاسيلي: أحتاج إلى وقت ، حوالي 15 دقيقة ، لجعل كل شيء في فريق واحد ، قرأت ذلك ...
(بيتر بوقاحة يقاطع يونيو دقيق وذكي للغاية.)
بيتر: اكتب في فرق منفصلة ، وسيكون من الأسهل قراءتها.


Dockerfile ينمو:


 FROM ubuntu:latest RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

ثم اقتحم إيغور إيفانوفيتش المكتب ، ديف أوبس (ولكن عدد العمليات أكبر من ديف) ، وصرخ:


AI: Petya ، قام المطورون مرة أخرى بتحطيم قاعدة بيانات prod ، متى ينتهي الأمر ....


بعد قليل من المناوشات ، يهدأ إيجور إيفانوفيتش ويبدأ في معرفة ما يفعله زملاؤه هنا.


AI: ماذا تفعل؟
باسل: بيتر يساعدني في تجميع Dockerfile لوحدة نمطية جديدة.
ثانياً: دعنا نلقي نظرة ... ماذا تكتب هنا ، يمكنك تنظيف المستودع بأمر منفصل ، هذه طبقة إضافية ... لكن كيف تضع التبعيات إذا لم تقم بنسخ Gemfile! وعلى أي حال ، هذا ليس جيدا.
بيتر: يرجى الاطلاع على عملك ، وسنعرف ذلك بطريقة أو بأخرى.


يتنهد إيجور إيفانوفيتش بحزن ويترك من الذي كسر قاعدة البيانات.


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


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


Dockerfile الآن يبدو مثل هذا:


 FROM ubuntu:latest COPY ./ /app WORKDIR /app RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

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


بعد 10 دقائق واثنين من أشرطة الفيديو حول القطط.


س: فعلت كل شيء. أضفت أيضا التعليقات.
P: عرض!


نسخة جديدة من Dockerfile:


 FROM ubuntu:latest #    COPY ./ /app WORKDIR /app #    RUN apt-get update #   RUN apt-get upgrade #    RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor #  bundler RUN gem install bundler #  nodejs     RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs #   RUN bundle install --without development test --path vendor/bundle #     RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* #  ,   ,    . CMD [“/app/init.sh”] 

P: عظيم ، أنا أحب ذلك. والتعليقات باللغة الروسية مريحة وقابلة للقراءة ، فإن الجميع سيعملون على هذا النحو. لقد علمتك كل شيء ، ثم يمكنك أن تفعل ذلك بنفسك. دعنا نذهب شرب القهوة ...


حسنًا ، لدينا هنا Dockerfile الرهيبة للغاية ، من منظورها الذي يريد إيغور إيفانوفيتش الإقلاع عنه وستؤلم عينيه لمدة أسبوع آخر. Dockerfile ، بالطبع ، يمكن أن يكون أسوأ ، لا يوجد حد الكمال. ولكن بالنسبة للمبتدئين ، وسوف تفعل.


أود أن أنهي باقتباس من غريغوري أوستر:


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


محدث : في التعليقات يسألون ما هو الخطأ في هذه Dockerfiles. في اليوم الآخر سأكتب مقالة منفصلة مع تحليل الأخطاء.

Source: https://habr.com/ru/post/ar449944/


All Articles