داکر: توصیه بد

داکر: توصیه بد

وقتی داشتم رانندگی ماشین را یاد می‌گرفتم، در همان درس اول، مربی به سمت عقب رفت و سپس گفت که نباید این کار را انجام دهید - هرگز. این قانون را بلافاصله و تا آخر عمر به یاد آوردم.

«توصیه بد» نوشته گریگوری اوستر را برای بچه‌ها می‌خوانید و می‌بینید که چقدر راحت و طبیعی به ذهنشان می‌رسد که نباید این کار را انجام دهند.

مقالات زیادی در مورد نحوه صحیح نوشتن Dockerfile نوشته شده است. اما من به دستورالعمل هایی در مورد نحوه نوشتن Dockerfiles نادرست برخورد نکردم. من این شکاف را پر می کنم. و شاید در پروژه هایی که من از آنها پشتیبانی دریافت می کنم، چنین فایل های docker کمتری وجود داشته باشد.

همه شخصیت ها، موقعیت ها و Dockerfile ساختگی هستند. اگر خودتان را می شناسید، ببخشید.

ایجاد یک Dockerfile، شوم و وحشتناک

پیتر (توسعه دهنده ارشد java/rubby/php): همکار واسیلی، آیا قبلا ماژول جدیدی را در Docker آپلود کرده اید؟
واسیلی (جونیور): نه، وقت نداشتم، با این داکر نمی توانم آن را بفهمم. مقالات زیادی در مورد آن وجود دارد، این گیج کننده است.

پیتر: ما یک سال پیش مهلت داشتیم. اجازه دهید من به شما کمک کنم، ما در این روند آن را مشخص خواهیم کرد. به من بگو چه چیزی برای تو کار نمی کند.

واسیلی: من نمی توانم یک تصویر اساسی را طوری انتخاب کنم که حداقل باشد، اما همه چیزهایی را که شما نیاز دارید داشته باشد.
پیتر: تصویر اوبونتو را بگیرید، هر چیزی که نیاز دارید را دارد. و بسیاری از چیزهای غیر ضروری بعداً به کار خواهند آمد. و فراموش نکنید که آخرین تگ را قرار دهید تا نسخه همیشه جدیدترین باشد.

و اولین خط در Dockerfile ظاهر می شود:

FROM ubuntu:latest

پیتر: بعد از چه چیزی برای نوشتن ماژول خود استفاده کردیم؟
واسیلی: پس روبی، یک وب سرور وجود دارد و باید چند دیمون سرویس راه اندازی شود.
پیتر: آره، به چه چیزی نیاز داریم: روبی، باندلر، نودج، ایماژجیک و چیزهای دیگر... و در عین حال، یک ارتقاء انجام دهید تا قطعا بسته‌های جدید دریافت کنید.
واسیلی: و ما یک کاربر ایجاد نمی کنیم تا تحت روت نباشیم؟
پیتر: لعنت بهش، پس هنوز باید حقوق رو گول بزنی.
واسیلی: من به زمان نیاز دارم، حدود 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: داری چیکار میکنی؟
واسیلی: پیتر به من کمک می کند یک Dockerfile برای یک ماژول جدید ایجاد کنم.
AI: بذار یه نگاهی بندازم... اینجا چی نوشتی، مخزن رو با یه دستور جداگانه پاک میکنی، این یه لایه اضافیه... اما اگه Gemfile رو کپی نکرده باشی چطوری وابستگی ها رو نصب کنی! و به طور کلی، این خوب نیست.
پیتر: لطفاً به کار خود ادامه دهید، ما به نحوی آن را حل خواهیم کرد.

ایگور ایوانوویچ با ناراحتی آه می کشد و می رود تا بفهمد چه کسی پایگاه داده را خراب کرده است.

پیتر: بله، اما او در مورد کد درست می‌گفت، باید آن را به تصویر فشار دهیم. و بیایید بلافاصله ssh و supervisor را نصب کنیم، در غیر این صورت دیمون ها را شروع می کنیم.

واسیلی: سپس ابتدا 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 شروع کنید تا بتوانیم به کانتینر وصل شویم و ببینیم چه مشکلی پیش آمده است. سپس Supervisor را به همین ترتیب اجرا کنید. خوب، پس شما فقط مسافر را اجرا می کنید.
س: اما خواندم که باید یک فرآیند وجود داشته باشد، بنابراین داکر متوجه می‌شود که مشکلی پیش آمده است و می‌تواند کانتینر را دوباره راه‌اندازی کند.
پ: سرت را با مزخرفات آزار نده. و به طور کلی چگونه؟ چگونه همه اینها را در یک فرآیند اجرا می کنید؟ بگذارید ایگور ایوانوویچ در مورد ثبات فکر کند ، بیهوده نیست که او حقوق می گیرد. وظیفه ما نوشتن کد است. و در کل بگه ممنون که ما Dockfile رو براش نوشتیم.

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، البته، می تواند حتی بدتر باشد، هیچ محدودیتی برای کمال وجود ندارد. اما برای شروع، این کار انجام خواهد شد.

من می خواهم با نقل قولی از گریگوری اوستر پایان دهم:

اگر هنوز مطمئن نیستید
ما مسیر زندگی را انتخاب کردیم،
و نمیدانی چرا
سفر کار خود را آغاز کنید،
لامپ های راهرو را بشکنید -
مردم به شما "متشکرم" خواهند گفت.
شما به مردم کمک خواهید کرد
صرفه جویی در مصرف برق

منبع: www.habr.com

اضافه کردن نظر