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

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

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

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

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

جميع الشخصيات والمواقف وDockerfile وهمية. إذا عرفت نفسك، آسف.

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

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

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

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

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

FROM ubuntu:latest

بيتر: ما هي الخطوة التالية، ما الذي استخدمناه لكتابة وحدتنا؟
فاسيلي: إذن يا روبي، هناك خادم ويب ويجب إطلاق اثنين من برامج الخدمة الشيطانية.
بيتر: نعم، ماذا نحتاج: Ruby وbundler وnodejs و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/*

ثم اقتحم إيجور إيفانوفيتش، DevOps (لكنه أكثر Ops من Dev)، المكتب وهو يصرخ:

AI: بيتيا، قام المطورون لديك بكسر قاعدة بيانات الطعام مرة أخرى، متى سينتهي هذا...

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

AI: ماذا تفعل؟
فاسيلي: يساعدني بيتر في إنشاء ملف Dockerfile لوحدة نمطية جديدة.
AI: دعني ألقي نظرة... ماذا كتبت هنا، قمت بتنظيف المستودع بأمر منفصل، هذه طبقة إضافية... ولكن كيف تقوم بتثبيت التبعيات إذا لم تقم بنسخ ملف 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/* 

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

10 دقائق وفيديوهين عن القطط لاحقًا.

س: لقد فعلت كل شيء. أضفت المزيد من التعليقات.
ف: أرني!

أحدث إصدار من ملف 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”]

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

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

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

إذا لم تكن متأكدا بعد
لقد اخترنا طريق الحياة
وأنت لا تعرف السبب
ابدأ رحلتك العمالية،
كسر المصابيح الكهربائية في الممرات -
سيقول الناس لك "شكرًا".
سوف تساعد الناس
توفير الكهرباء.

المصدر: www.habr.com

إضافة تعليق