چند نکته جالب برای بهینه کردن داکرفایل Dockerfile - قسمت دوم

سلام. امروز میریم به سراغ ادامه قسمت قبلی که راجب بهینه کردن داکرفایل صحبت کردیم. همچنین دوباره یادآوری میکنم که نکاتی که اراعه میدم ممکنه ۱۰۰ درصد دقیق نباشه اما تلاش من بر این هست که حداکثر دقت رو داشته باشه. همچنین یادآوری میکنم که برای درک این نکات لازمه که دانش حداقلی با داکر و داکرفایل داشته باشید.از دوستان آگاه در زمینه داکر خواهش میکنم در صورت مشاهده هر اشتباهی در نظرات ما رو باخبر کنن.حالا بریم سر ادامه مطلب:ورژن های مختلف یک ایمیج رو با استیج جداگانه تعیین کنیدگاهی اوقات میخوایم که ورژن های مختلف یک ایمیج رو برای سیستم عامل های مختلف یا موقعیت های مختلف استفاده کنیم برای این کار میتونیم چندین FROM از یک ایمیج منتها با ورژن های مختلف وارد کنیم و سپس در دستور اجرایی نام اون رو وارد کنیم.از متغیر ها میتونیم استفاده کنیمیک امکان جالب در داکرفایل این هست که میتونیم متغیر های مختلف رو بسازیم و مقدار اون رو به عنوان پارامتر در دستور ترمینال بگیریم. یکی از مزیت هاش این هست که باعث میشه از تکرار مجدد کد های داکرفایل جلوگیری کنیم. در مورد بالا که اشاره کردیم برای هر ورژن یک ایمیج کد ها رو مجددا استفاده کرده و حجم کد رو بالا برده. در اینجا میتونیم از متغیر ها استفاده کنیم و در ترمینال ورژن مورد نظر رو دریافت کنیم.در اینجا در هنگام اجرای دستور در ترمینال میتونیم با پارامتر --build-arg متغیر ها و مقدار های اون رو قرار بدیم.مراقب پر شدن هاردتون باشید :)بعد از مدتی که با داکر و کانتینر ها زیاد کار میکنید متوجه میشید که حجم زیادی رو اشغال کرده و برای کسایی که تو مقدار هارد محدودیت دارند ممکنه اذیت کننده باشه. با وارد کردن دستور زیر میتونید فایل های کش و اضافی رو حذف کنید.با وارد کردن این دستور محتوای زیر حذف میشوند:تمامی کانتینر های متوقف شدهتمامی نتورک هایی که حداقل در یک کانتینر استفاده نشده اندتمامی ایمیج های بی مصرفتمامی کش مربوط به کانتینر های ساخته شدهمیتونید روند تمیز کردن داکر رو اتوماتیک کنیدبا وارد کردن دستور زیر میتونید عملیات بالا که اشاره کردیم رو اتوماتیک کنید که به طور خودکار هر چند ساعت یا چند دقیقه اجرا بشه. $ docker run -d --restart=unless-stopped --name cleanup \ -v /var/run/docker.sock:/var/run/docker.sock \ docker /bin/sh -c \ &quotwhile true; do docker system prune -f; sleep 1h; done&quotداکرفایل از نوع "بزن در رو"گاهی اوقات ما میخوایم که یک داکرفایل کوتاه و اینلاین inline داشته باشیم و کد های داخل داکرفایل رو مستقیما در ترمینال قرار بدیم. یا اینکه میخوایم الکی فایل Dockerfile برای یک عملیات کوچیک نسازیم.اینجاست که این روش به کار میاد. برای انجامش ۲ تا راه داریم که هر ۲تارو در زیر قرار دادم.هر دو روش زیر یک نتیجه رو دارند و عملیات یکسانی رو انجام میدن.$ echo -e 'FROM busybox\nRUN echo &quothello world&quot' | docker build ---$ docker build -<<EOF FROM busybox RUN echo &quothello world&quot EOFبه جای چند تا RUN از یک RUN استفاده کنیدبرای اجرا کردن چندین دستور در یک کانتینر میتونیم چندین RUN استفاده کنیم یا اینکه از یک RUN اما با چندین دستور یکجا استفاده کنیم. تفاوت اینها در سرعت اجرای آنها و بهینه بودن مصرف منابع سیستم هستش. به این دلیل که برای هر دستور RUN یک لایه از کانتینر ساخته میشه و منابع بیشتری رو مصرف میکنه و سرعت کمتری پیدا میکنه.روش بهینهRUN apt-get update && apt-get install -y \ ‌‌ bzr \ cvs \ git \ mercurial \ subversion \ && rm -rf /var/lib/apt/lists/*روش غیر بهینهRUN apt-get update && apt-get install -y bzr RUN apt-get install -y cvs RUN apt-get install -y git RUN apt-get install -y mercurial RUN apt-get install -y subversion && rm -rf /var/lib/apt/lists/*خب تا اینجا به چند تا مورد اشاره کردیم. در قسمت های بعدی به نکته های دیگری اشاره میکنیم که ممکنه به دردتون بخوره. خواهش میکنم از دوستان آگاه نظراتشون رو قرار بدن تا کیفیت قسمت های بعدی بالاتر بره.تا درودی دیگر بدرود :)